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
или два разных UserControl
s, это два абонента и, следовательно, два звонка (по одному на каждый экземпляр).