Как я могу явно поддерживать состояние просмотра для динамически создаваемых пользовательских элементов управления? - PullRequest
0 голосов
/ 21 сентября 2011

У меня есть форма поиска, которая предлагает ряд различных параметров поиска, таких как «поиск по естественному имени», «поиск по допустимому имени», «поиск по адресу» и т. Д. Они определяются статическими методами «фабрики» вPropertySearchOption класс.Каждый параметр поиска указывает пользовательский элемент управления, содержащий поля поиска, необходимые для этого параметра, например, параметр естественного имени имеет поля имени и фамилии.Используемая опция поиска определяется RadioButtonList на главной странице поиска, и когда выбор изменяется в этом списке, я динамически загружаю требуемый пользовательский элемент управления.Моя проблема в том, что я не могу найти способ сохранить состояние просмотра динамического элемента управления и его полей поиска.Вот основной код, который я использую:

<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;
}

Я должен установить EnableViewState в false на searchFormPlaceHolder, или я получаю исключение viewstate, когда я пытаюсь изменить текущий параметри так динамический выбор форм поиска работает нормально.Однако при нажатии кнопки обратной передачи для выполнения поиска я теряю форму поиска, поскольку она создается только в Page_Init при первой загрузке, а не при обратной передаче.Если я помещу LoadSearchForm за пределы блока if, произойдет сбой, потому что при обратной передаче SelectedValue списка переключателей пуст.

Что я могу сделать или что я должен сделать в сценариикак, кроме того, убегать?

1 Ответ

0 голосов
/ 21 сентября 2011

Вы можете сохранить опцию типа поиска в HiddenField, чтобы вы могли создавать форму поиска при каждой обратной передаче (и не забудьте указать уникальный идентификатор для ваших динамически создаваемых элементов управления)

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;
}
...