这与 ASP.NET、ViewState、UserControls 和丢失我的属性值有关。这是一个经典的问题,我知道,尽管我已经在这里和谷歌上搜索过这个问题的解决方案,但我还没有成功。相反,我测试不同的东西越多,我似乎就越不了解它。
除此之外,我正在使用 ext.net 和他们所谓的 DirectMethod,但我认为这与这个问题没有太大关系。我有很多问题,我希望这篇文章具有相当的可读性和可理解性 =)
用户控件
我有一个包含一些属性的 UserControl,Customers.ascx。“最”重要的是 *_CustomerId*。_CustomerId 在代码隐藏中设置,在 ext.net 的“DirectMethod”中,如下所示(以下代码来自页面 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”是 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?我错过了什么?
还:
我实际上在页面上有两个用户控件,另一个名为“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 中的行时,UserControl 中的 Page_Load都会执行两次,即使我只在 SetCustomer() 方法中更新其中一个。
这是为什么?
任何提示、想法和帮助将不胜感激。