ASP.NET / UserControl, ViewState и потеря значений свойств

Это касается ASP.NET, ViewState, UserControls и потери значений моих свойств. Знаю, это классический вопрос, и я знаю, что, хотя я искал здесь и в Google решение этой проблемы, мне это не удалось. Наоборот, чем больше я тестирую разные вещи, тем меньше понимаю, что кажется.

Кроме того, я использую ext.net и их так называемые DirectMethod, но я не думаю, что это во многом связано с этой проблемой. У меня множество вопросов, и я надеюсь, что этот текст будет достаточно читабельным и понятным =)

Пользовательский контроль

У меня есть UserControl, Customers.ascx, который содержит некоторые свойства. "Самым важным" является *_CustomerId*. _CustomerId устанавливается в выделенном коде, в "DirectMethod" ext.net, как это (код ниже на странице Customers.aspx):

    [DirectMethod]
    public void SetCustomer()
    {
        RowSelectionModel sm = GridPanel2.SelectionModel.Primary as RowSelectionModel;

        if (sm.SelectedRow != null)
        {
            uint customerId = uint.Parse(sm.SelectedRow.RecordID);
            customer_modify._CustomerId = customerId;
        }
    }

"Customer_modify" является экземпляром UserControl, как определено в Customers.aspx (страница, а не UserControl):

<asp:Content ID="Content2" ContentPlaceHolderID="CPH_center" runat="server">
    <CP:Customer ID="customer_modify" runat="server" _IsCreateMode="false" ViewStateMode="Enabled" />   
</asp:Content>

На этой странице Customers.aspx у меня есть ext.net GridPanel, в котором перечислены клиенты, и когда я щелкаю строки в GridPanel, выполняется (Direct) метод SetCustomer.

Как вы можете видеть в методе SetCustomer, свойство "_CustomerId" обновляется с помощью uint, поэтому давайте посмотрим на свойство в UserControl:

    public uint _CustomerId 
    { 
        get
        {
            object o = ViewState["_CustomerId"];
            if (o == null)
                return 0;
            return (uint)o;
        }
        set
        {
            object o = ViewState["_CustomerId"];
            ViewState["_CustomerId"] = value;
            SetCustomer();
        }
    }

Как видите, я использую ViewState-thingie, и я надеялся, что состояние, то есть значение свойств, будет запомнено. Они не.

Когда я щелкаю строку в GridPanel в первый раз, я вижу (ломая), что ViewState["_CustomerId"] == null, что в порядке. После этого я вижу, что установщик для _CustomerId выполняется и что ViewState ["_ CustomerId"] назначается RecordID (uint).

Теперь я щелкаю другую строку в GridPanel, и метод SetCustomer выполняется снова. Я ломаю сеттер для _CustomerId и смотрю на то, что ViewState ["_ CustomerId"] ДО его назначения. Это 0, но я ожидаю, что это будет значение из предыдущей строки.

Почему это 0? Что мне не хватает?

Также:

У меня на самом деле есть два пользовательских элемента управления на странице, другой с именем customer_create:

<ext:Window 
        ID="Window_CreateNewCustomer" 
        runat="server" 
        Icon="New"
        Title="Skapa ny kund" 
        Hidden="true"
        Width="480"
        Height="370"
        Modal="true">

        <Content>
            <CP:Customer ID="customer_create" runat="server" Title="Skapa ny kund" _IsCreateMode="true" />
        </Content>
</ext:Window>

Меня очень беспокоит то, что каждый раз, когда я нажимаю на строку в GridPanel, Page_Load в UserControl выполняется дважды, хотя я обновляю только один из них в методе SetCustomer()-.

Это почему?

Любые советы, идеи и помощь будут с благодарностью.

1 ответ

Решение

ViewState сериализуется, шифруется и отправляется клиенту как скрытое поле формы, чтобы его можно было восстановить, когда что-то инициирует отправку формы. [DirectMethod] не проходит отправку формы (обрабатывается как вызов AJAX), поэтому не может ни читать, ни записывать ViewState данные, если обратное отключение этих данных не запрашивается ViewStateMode.Enabled,

По любому запросу, направленному в форму, Load событие будет запущено со страницы и, таким образом, получено каждым пользовательским элементом управления на странице, которая подписывается на событие на ожидаемой фазе жизненного цикла обработки страницы - будь то два экземпляра одного UserControlили два разных UserControls, это два абонента и, следовательно, два звонка (по одному на каждый экземпляр).

Другие вопросы по тегам