ASP.NET - ViewState: пустой заполнитель генерирует состояние просмотра

На моей веб-странице у меня есть PlaceHolder, в него не загружаются элементы управления.

<asp:PlaceHolder ID="PlaceHolderStatMain" runat="server">
</asp:PlaceHolder>

Я ищу ViewState, созданный для страницы, он следующий:

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUJLTg1NDkyNTUzD2QWAgIDD2QWAgIND2QWAmYPZBYCAgEPZBYCZg9kFgJmD2QWBmYPFQEYL3N0YXRfc3RhZGl1bS9sZWFndWVfV0VGZAIBDxUBGC9zdGF0X3N0YWRpdW0vbGVhZ3VlX0VFRmQCAg8VARgvc3RhdF9zdGFkaXVtL2xlYWd1ZV9GQ1VkZEuSBUr5LFL6WfCehNBJgjrq0GzwWCWN2qlU70V7LAAb" />

Когда я устанавливаю для EnableViewState значение false:

<asp:PlaceHolder ID="PlaceHolderStatMain" runat="server" EnableViewState="false">
</asp:PlaceHolder>

Контент состояния просмотра был значительно уменьшен:

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUJLTg1NDkyNTUzZGTTn8Y28VwmpE/K7yPPkLFvhrqMdU8THijFW/BMFzk0tQ==" />

Вопрос: как удалить «бесполезное» содержимое состояния просмотра без отключения состояния просмотра для самого заполнителя (я бы хотел, чтобы другой элемент управления, загруженный в заполнитель, имел состояние просмотра)?

Это вообще возможно?

Любые мысли приветствуются!

P.S. Я использую ASP.NET 4.0


person Budda    schedule 01.01.2011    source источник


Ответы (1)


В ASP.Net 4.0 вы можете отключить состояние просмотра для страницы с помощью ViewStateMode и включите его для элементов управления, которым он нужен. Label1 будет иметь состояние просмотра, а Label2 не будет, поскольку он наследует состояние Disabled от страницы.

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs"
    ViewStateMode="Disabled" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
    <title>View State Demo in ASP.NET 4.0</title>
</head>
<body>
   <form id="form1" runat="server">
     <div>
        <asp:Label ID="Label1" runat="server" Text="One" ViewStateMode="Enabled"></asp:Label><br />
        <asp:Label ID="Label2" runat="server" Text="Two"></asp:Label> <br /><br />      
        <asp:Button ID="Button1" runat="server" Text="PostBack" />
      </div>
    </form>
  </body>
</html>
person Mikael Svenson    schedule 01.01.2011
comment
Итак, вы предлагаете отключить ViewState для заполнителя, но если он понадобится некоторым элементам управления - мне нужно будет включить его явно для определенных элементов управления. Я прав? - person Budda; 01.01.2011
comment
Да, у вас есть еще один вариант - отключить его для всех, кому он не нужен. Другой способ - вместо этого создать приложение MVC, которое не имеет состояния и не использует ViewState. Но использование MVC - это другой стиль создания приложений. Вы также можете использовать уловки, чтобы сохранить состояние просмотра на сервере или сжать его для экономии места, если вас это беспокоит. - person Mikael Svenson; 01.01.2011
comment
MVC не вариант ... У меня есть веб-сайт, который невозможно переписать на MVC. А внутри PlaceHolder нет управления, поэтому отключать нечего, кроме самого плейсхолдера. К счастью, приложение перекомпилировано под asp.net 4.0, так что я могу продолжить это предложение. Но и другие (если есть) тоже приветствуются! - person Budda; 01.01.2011
comment
@Budda: В чем проблема с включенным режимом просмотра для всех элементов управления? Что вы пытаетесь достичь? Возможно, вы захотите проверить mikemason.ca/blog/2008/11/compressing-viewstate и hanselman.com/blog/. - person Mikael Svenson; 01.01.2011
comment
Я отвечу еще на один вопрос: что хорошего в бесполезной информации, которая вызывает проблемы с производительностью / трафиком? Другой ответ: рекомендации Microsoft по отключению ViewState, когда это не требуется. - person Budda; 02.01.2011
comment
Бесполезная информация бесполезна, но разработчики фреймворка не могут знать, что полезно, а что нет. Вместо создания специального кода при реализации элемента управления-заполнителя он наследуется от той же базы, что и другие веб-элементы управления, и, следовательно, имеет состояние просмотра. Нет ничего идеального, но предоставление состояния просмотра-заполнителя требует небольших затрат, поскольку оно может унаследовать многие другие свойства. По крайней мере, по моему мнению. Весь специальный код требует большего обслуживания и, возможно, большего количества ошибок. - person Mikael Svenson; 02.01.2011