Не удается удалить скрытое поле viewstate - PullRequest
0 голосов
/ 27 марта 2012

У меня есть массивное скрытое поле viewstate, из-за которого мое приложение не работает.Я пробовал:

  • EnableViewState="false" на каждом элементе управления
  • EnableViewState="false" в директиве страницы
  • Page.EnableViewState = false в Page_Init
  • <pages enableViewState="false" /> in web.config

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

Я исследовал скрытое полеиспользуя этот инструмент , и в нем, по-видимому, почти нет информации (поскольку я отключил свойство в каждом элементе управления, вероятно).По какой-то причине, страница настаивает на включении скрытого поля длиной в тысячи и тысячи строк.

Как мне избавиться от этого поля (или уменьшить его до полезного размера) навсегда?


Вот пример из оскорбительного GridView:

<asp:GridView ID="MyGrid" runat="server" AutoGenerateColumns="False" 
      EnableModelValidation="True" EnableViewState="False" 
      CssClass="my-report">
      <Columns>
          <asp:TemplateField>
              <HeaderTemplate>
                <span title='title' class="abbr">My ID</span>
              </HeaderTemplate>
              <ItemTemplate>
                <%# Eval("my_id") %>
              </ItemTemplate>
          </asp:TemplateField>
          <asp:TemplateField>
              <HeaderTemplate>
                <span title='title2' class="abbr">Second col heading</span>
              </HeaderTemplate>
              <ItemTemplate>
                  <asp:ListView ID="MyListView" runat="server" EnableViewState="False">
                     <LayoutTemplate>
                        <ul>
                            <asp:PlaceHolder runat="server" ID="itemPlaceHolder" EnableViewState="False" />
                        </ul>
                     </LayoutTemplate>
                     <ItemTemplate>
                            <li><%# Eval("field_2")%></li>
                     </ItemTemplate>
                   </asp:ListView>
              </ItemTemplate>
          </asp:TemplateField>
      </Columns>
  </asp:GridView>

Ответы [ 4 ]

1 голос
/ 27 марта 2012

Если ваш GridView неинтерактивный (то есть он не содержит дочерних элементов управления, отправляющих сообщения назад), вы можете уменьшить размер состояния просмотра, дождавшись вызова метода Render страницы дляпривязать сетку:

Protected Overrides Sub Render(writer As HtmlTextWriter)
    MyGrid.DataSource = ...
    MyGrid.DataBind()
    MyBase.Render(writer)
End Sub
1 голос
/ 27 марта 2012

Скрытое поле, которое вы видите на странице, предназначено не только для ViewState, оно также содержит ControlState.Нет никакого способа отключить состояние управления, поэтому вам нужно найти способ жить с ним.Сколько элементов отображает сетка?

В качестве последнего варианта вы можете рассмотреть сжатие сгенерированного поля viewstate.

Здесь у вас есть статья MSDN, объясняющая, как ControlState работает

0 голосов
/ 01 октября 2014

Другой вариант - использовать Flesk.ViewState.

Может помещать состояние просмотра в файлы, сжимать его, сеанс и т. Д.

Как говорят другие, иногда в ASPNET неизбежно жить с ViewState.

Вот почему ваш лучший вариант - перейти на MVC:)

0 голосов
/ 27 марта 2012

В случае, если у кого-то есть подобная проблема, это происходило, потому что у меня был ListView внутри каждой строки сетки.Я заменил ListView на Repeater, и состояние представления больше не является проблемой.

...