Asp.net 如何显式维护动态创建的用户控件的视图状态?

Asp.net 如何显式维护动态创建的用户控件的视图状态?,asp.net,webforms,viewstate,asp.net-4.0,Asp.net,Webforms,Viewstate,Asp.net 4.0,我有一个搜索表单,它提供了许多不同的搜索选项,例如“自然名称搜索”、“法定名称搜索”、“地址搜索”等。这些是由PropertySearchOption类上的静态“工厂”方法定义的。每个搜索选项指定一个用户控件,其中包含该选项所需的搜索字段,例如,自然名称选项具有名称和姓氏字段。使用的搜索选项由主搜索页面上的RadioButton列表确定,当此列表中的选择更改时,我会动态加载所需的用户控件。我的问题是,我找不到一种方法来保存动态控件及其搜索字段的视图状态。以下是我正在使用的核心代码: <as

我有一个搜索表单,它提供了许多不同的搜索选项,例如“自然名称搜索”、“法定名称搜索”、“地址搜索”等。这些是由PropertySearchOption类上的静态“工厂”方法定义的。每个搜索选项指定一个用户控件,其中包含该选项所需的搜索字段,例如,自然名称选项具有名称和姓氏字段。使用的搜索选项由主搜索页面上的RadioButton列表确定,当此列表中的选择更改时,我会动态加载所需的用户控件。我的问题是,我找不到一种方法来保存动态控件及其搜索字段的视图状态。以下是我正在使用的核心代码:

<asp:RadioButtonList ID="searchTypeOptions" runat="server" AutoPostBack="true" RepeatDirection="Horizontal" RepeatLayout="Flow" OnSelectedIndexChanged="SearchTypeOptionsSelectedIndexChanged">
    <asp:ListItem Value="NaturalName">Name (Natural)</asp:ListItem>
    <asp:ListItem Value="LegalName">Legal Name (Business)</asp:ListItem>
    <asp:ListItem Value="ErfDetails">Erf Details</asp:ListItem>
    <asp:ListItem Value="PhysicalAddress">Physical Address</asp:ListItem>
    <asp:ListItem Value="FarmDetails">Farm</asp:ListItem>
</asp:RadioButtonList>

protected void Page_Init(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        var typeOption = searchTypeOptions.SelectedItem;
        if (typeOption == null)
        {
            searchTypeOptions.SelectedValue = "ErfDetails";
            LoadSearchForm();
        }
    }
}

protected void SearchTypeOptionsSelectedIndexChanged(object sender, EventArgs e)
{
    LoadSearchForm();
}

protected virtual void LoadSearchForm()
{
    SearchOption = (PropertySearchOption)typeof(PropertySearchOption).GetProperty(searchTypeOptions.SelectedValue, BindingFlags.NonPublic | BindingFlags.Static).GetValue(null, null);
    searchFormPlaceHolder.Controls.Clear();
    var searchForm = LoadControl(SearchOption.FormControlUrl);
    searchFormPlaceHolder.Controls.Add(searchForm);
    searchTypeLabel.Text = SearchOption.Description;
}
我必须在searchFormPlaceHolder上将EnableViewState设置为false,或者在尝试更改当前选项时出现viewstate异常,这样搜索表单的动态选择就可以正常工作。但是,在单击“回发”按钮执行搜索时,我丢失了搜索表单,因为它仅在第一次加载时在Page_Init中创建,而不是回发。如果我将LoadSearchForm放置在If块之外,它将失败,因为在回发时,单选按钮列表的SelectedValue为空


在这种情况下,除了逃跑之外,我还能做什么,或者应该做什么呢?

您可以将搜索类型选项保存在一个隐藏字段中,这样您就可以在每次回发时创建搜索表单,并记住为动态创建的控件设置一个唯一的id

protected void Page_Init(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        var typeOption = searchTypeOptions.SelectedItem;
        if (typeOption == null)
        {
            searchTypeOptions.SelectedValue =
                 myHiddenField.Value = "ErfDetails";
            LoadSearchForm("ErfDetails");
        }
    }
    else
       LoadSearchForm(Request.Form[myHiddenField.UniqueID]);
}

override void OnPreRender(EventArgs e) {
    myHiddenField.Value = searchTypeOptions.SelectedValue;
}

protected void SearchTypeOptionsSelectedIndexChanged(object sender, EventArgs e)
{
    LoadSearchForm(searchTypeOptions.SelectedValue);
}

protected virtual void LoadSearchForm(string option)
{
    SearchOption = (PropertySearchOption)typeof(PropertySearchOption).GetProperty(option, BindingFlags.NonPublic | BindingFlags.Static).GetValue(null, null);
    searchFormPlaceHolder.Controls.Clear();
    var searchForm = LoadControl(SearchOption.FormControlUrl);

    searchForm.ID = "mySearchForm";

    searchFormPlaceHolder.Controls.Add(searchForm);
    searchTypeLabel.Text = SearchOption.Description;
}