Бесплатное отображение и скрытие частей веб-формы во избежание проблем с загрузкой ViewState

Эта проблема

У меня есть веб-форма, и я хотел бы скрыть и показать некоторые панели. Когда я говорю "Панель", я не имею в виду Panel контроль, но только панель в html (обычно представлена ​​DIV).

Ну, я хочу показать и скрыть эти панели, как я хочу... без ограничений означает, что не обязательно только одна панель должна быть видимой, а также 2, 3 или 4.

Обычно я достиг этого путем:

<div id="mypane1" runat="server">
  ...
</div>
<div id="mypane2" runat="server">
  ...
</div>
<div id="mypane3" runat="server">
  ...
</div>

и это:

this.mypane1.Visible = true;
this.mypane2.Visible = false;
this.mypane3.Visible = true;

К сожалению, эти панели содержат элементы управления, и некоторые из них не отображаются с самого начала (первая загрузка веб-формы, поэтому, когда нет PostBack бывает). Это приводит к проблемам для ViewState погрузка.

Относительно загрузки ViewState

Конечно, многие, очевидно, спросят об этом ViewState проблемы мои. Ну, вкратце, дело в следующем: ViewState Ошибка загрузки не легко справиться, но в конце я понял следующее.

Скажем, чтобы иметь это:

<!-- In .aspx -->
<div id="mypane1" runat="server">
  ...
  <asp:Literal ID="..." runat="server" ...></asp:Literal>
  <asp:TextBox ID="..." runat="server" ...></asp:TextBox>
  ...
</div>
<div id="mypane2" runat="server">
  ...
  <asp:LinkButton ID="lb1" OnClick="lb1_Click" runat="server" ...></asp:LinkButton>
  <asp:LinkButton ID="lb2" OnClick="lb2_Click" runat="server" ...></asp:LinkButton>
  <asp:LinkButton ID="lb3" OnClick="lb3_Click" runat="server" ...></asp:LinkButton>
  ...
</div>
<div id="mypane3" runat="server">
  ...
  <asp:TextBox ID="..." runat="server" ...></asp:TextBox>
  <asp:LinkButton ID="lb4" OnClick="lb4_Click" runat="server" ...></asp:LinkButton>
  <asp:TextBox ID="..." runat="server" ...></asp:TextBox>
  ...
</div>

// In .aspx.cs
protected void Page_Load(...) {
  if (!this.IsPostBack) {
    this.mypane1.Visible = true;
    this.mypane2.Visible = false;
    this.mypane3.Visible = true;
  }
}

/// ... In the page many happens and the panes are shown and hidden ... ///

// Event Handlers
protected void lb1_Click(object sender, EventArgs e) {
  ...
}
protected void lb2_Click(object sender, EventArgs e) {
  ...
}
protected void lb3_Click(object sender, EventArgs e) {
  ...
}
protected void lb4_Click(object sender, EventArgs e) {
  ...
}

Ну проблема в следующем.

  • В начале панель2 не отображается.

  • После некоторых действий отображается панель 2 и ее элементы управления.

  • Пользователь нажимает lb1 -> ViewState error

Обратите внимание, что то же самое происходит для каждого события, связанного с элементами управления pane2. Есть lb4 нажата, проблем нет.

Проблема состоит в том, что начальная иерархия представлена ​​элементами управления на панелях 1 и 3. Когда события инициируются элементами управления, не участвуют в начальной иерархии, ViewState признан противоречивым (потому что я действую на HtmlControls, обычно ServerControls более интеллектуальны и могут лучше управлять ViewState при добавлении в них элементов управления).

Возможные решения

Обратите внимание, что я мог бы просто сделать следующее, чтобы скрыть и показать панели:

this.mypane2.Attributes.Add("display", "none");

Это не то, что я хотел бы сделать по двум причинам:

  • Я хочу, чтобы панели не отображались как HTML.

  • Я хотел бы использовать серверные элементы управления.

Запрос

Мне нужно использовать веб-элементы управления для управления панелью, я не могу использовать HtmlControls потому что управляющая иерархия загружена неправильно.

Я старался MultiView и Просмотр элементов управления, но они позволяют мне использовать только один активный вид. Как я могу сделать?

Примечание: пожалуйста, не зацикливайтесь на ViewState проблема, это просто хороший способ сообщить вам, что происходит, мой единственный интерес состоит в том, чтобы найти способ скрывать и показывать панели свободно, используя элементы управления сервером.

Спасибо

3 ответа

Я предполагаю, что установка видимости в false для панелей приводит к тому, что дочерние элементы не добавляются в ViewState, или каким-либо образом мешает им. Это верно?

Учитывая это, если вы хотите иметь элементы управления в отношении механизма рендеринга.Net, но скрытые от конечного пользователя, вы можете попытаться показать и скрыть их с помощью css, т.е.

шоу

pnlDemo.Attributes.Add("style", "display:block");

скрывать

pnlDemo.Attributes.Add("style", "display:none");

У меня была ситуация, когда мне нужны элементы управления ASP.Net там для целей ViewState, но не показаны. В соответствующий момент я бы показал им, используя JQuery, и этот метод работает для этого сценария, поэтому он может работать для вашего.

Вы пытались использовать ViewStateModeByIdAttribute?

Класс ViewStateModeByIdAttribute используется для указания элемента управления, который требует загрузки состояния просмотра по идентификатору. По умолчанию режим загрузки состояния просмотра для ASP.NET загружает информацию о состоянии просмотра для элемента управления по его индексу в дереве элементов управления на странице. Производительность загрузки информации о состоянии просмотра по идентификатору повышается, поскольку дерево элементов управления страницей необходимо искать для элемента управления, прежде чем загружать его информацию о состоянии просмотра.

Вы пробовали с page.RegisterStartupScript . Скрипт будет загружен в конце загрузки страницы, поэтому контроль будет иметь свое состояние просмотра. Напишите код JavaScript, который получает идентификатор панели, чтобы скрыть и изменить CSS, чтобы скрытая видимость не отображалась.

еще одна кнопка asp, на которой вы хотите отобразить панель. Вы можете написать код JavaScript для события onClientClick кнопки, чтобы изменить CSS панели, чтобы изменить ее видимость.

Другие вопросы по тегам