1

这与 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() 方法中更新其中一个。

这是为什么?

任何提示、想法和帮助将不胜感激。

4

1 回答 1

2

ViewState被序列化,加密并作为隐藏的表单字段发送到客户端,以便在触发表单提交时可以重新构建它。A[DirectMethod]不通过表单提交(它作为 AJAX 调用处理),因此它既不能读取也不能写入ViewState数据,除非使用ViewStateMode.Enabled.

在指向表单的任何给定请求上,该Load事件将从页面触发,因此在页面处理生命周期的预期阶段订阅该事件的页面上的每个用户控件都将接收该事件- 无论它是一个的两个实例UserControl或两个不同UserControl的 s,它是两个订阅者,因此有两个调用(每个实例一个)。

于 2011-03-29T21:11:36.407 回答