ASP.NET / UserControl, ViewState и потеря значений свойств - PullRequest
1 голос
/ 30 марта 2011

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

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

UserControl

У меня есть 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,(Прямой) метод 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?Чего мне не хватает?

Также:

У меня на самом деле есть два элемента UserControls на странице, другой с именем 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 Ответ

2 голосов
/ 30 марта 2011

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

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

...