это касается 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 () -метод.
Почему это так?
Буду признателен за любые советы, идеи и помощь.