我有一个Asp.net页面,ViewStateMode =“已禁用”。但是,当我拉出trace.axd时,我仍然会看到一些控件的很多视图状态。我正在查看控制树中的“ViewState Size Bytes(不包括子项)”列。
E.g。一个这样的控制是 ctl00 $ WMge $ SLMP $ ctl00 $ rptRows $ ctl07 $ ctl02 System.Web.UI.DataBoundLiteralControl 4642 1824 0
但是,当我查看页面的视图状态时,它非常小并且看起来正确。知道在页面源中看到的视图状态与Trace.axd中显示的视图状态之间存在巨大差异的原因是什么?
答案 0 :(得分:0)
完全摆脱viewstate和我遇到的相关隐藏字段的唯一方法是在代码隐藏中使用hack。这里解释了这个黑客。
基本上在Page的渲染过程中,您会查找隐藏的字段并将其删除。当我做一些jquery的东西时,我不得不实现这一点,这些东西正在拉入第二个aspx页面,并且该页面中的视图状态与父页面中的视图状态混合并导致问题。避免使用viewstate的另一种方法是简单地使用MVC,但除非你正在开始一个新项目,否则这不是一个选项。
答案 1 :(得分:-1)
假设您有一个主页和一个内容页面。
MASTER PAGE
<!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; 使用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。以下是最终输出