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

Проблема

У меня есть веб-форма, и я хотел бы скрыть и показать некоторые панели.Когда я говорю «Панель», я имею в виду не элемент управления 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.

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

Запрос

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

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

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

Thankyou

Ответы [ 3 ]

1 голос
/ 08 января 2012

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

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

1 голос
/ 07 января 2012

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

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

show

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

hide

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

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

0 голосов
/ 05 августа 2014

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

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

...