Trace.axd показывает байты размера ViewState, даже когда ViewStateMode="Disabled"
У меня есть страница Asp.net, для которой ViewStateMode="Отключено". Однако, когда я поднимаю trace.axd, я все еще вижу много состояний для некоторых элементов управления. Я смотрю на столбец "ViewState Size Bytes (исключая дочерние элементы)" в дереве элементов управления.
Например, одно из таких управляющих существ
ctl00 $ WMge $ SLMP $ ctl00 $ rptRows $ ctl07 $ ctl02 System.Web.UI.DataBoundLiteralControl 4642 1824 0
Но когда я смотрю на состояние страницы, оно довольно маленькое и выглядит правильно. Любая идея, что может быть причиной такой большой разницы между состоянием просмотра, видимым в источнике страницы, и показанным в Trace.axd?
2 ответа
Единственный способ полностью избавиться от viewstate и связанных с ним скрытых полей, которые я испытал, - это использовать взлом в codebehind. Этот хак объясняется здесь.
Обычно во время рендеринга страницы вы ищете скрытые поля и удаляете их. Я должен был реализовать это некоторое время назад, когда делал некоторые вещи jquery, которые вытягивали вторую страницу aspx, и состояние просмотра с этой страницы смешивалось с состоянием родительской страницы и вызывало проблемы. Другой способ избежать viewstate - просто использовать MVC, но на самом деле это не вариант, если вы не начинаете новый проект.
Предположим, у вас есть мастер и страница контента.
МАСТЕР СТРАНИЦА
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head runat="server">
<title></title>
<link href="~/Styles/Site.css" rel="stylesheet" type="text/css" />
<asp:ContentPlaceHolder ID="HeadContent" runat="server">
</asp:ContentPlaceHolder>
</head>
<body>
<form runat="server">
<asp:ContentPlaceHolder ID="MainContent" runat="server"/>
</form>
</body>
</html>
КОНТЕНТ СТРАНИЦА
<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true"
EnableViewState="false" CodeBehind="Default.aspx.cs" Inherits="WebApplication1._Default" %>
<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent">
</asp:Content>
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
</asp:Content>
Это покажет вам вывод ниже на вашей отрендеренной странице.
Вы можете использовать приведенный ниже код, чтобы избежать этой ситуации.
используя Систему; использование System.Web; использование System.Text; использование System.Web.UI; используя System.IO; использование System.Text.RegularExpressions;
public class BasePage : Page
{
protected override void Render(HtmlTextWriter writer)
{
StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);
HtmlTextWriter hWriter = new HtmlTextWriter(sw);
base.Render(hWriter);
string html = sb.ToString();
html = Regex.Replace(html, "<input[^>]*id=\"(__VIEWSTATE)\"[^>]*>", string.Empty, RegexOptions.IgnoreCase);
writer.Write(html);
}
}
Код изменит визуализированный HTML. Ниже приведен окончательный вывод