即使ViewStateMode =“Disabled”,Trace.axd也会显示ViewState Size Bytes

时间:2012-01-31 16:09:55

标签: asp.net viewstate tracing

我有一个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中显示的视图状态之间存在巨大差异的原因是什么?

2 个答案:

答案 0 :(得分:0)

完全摆脱viewstate和我遇到的相关隐藏字段的唯一方法是在代码隐藏中使用hack。这里解释了这个黑客。

http://www.aspsnippets.com/Articles/How-to-disable-or-remove-ViewState-Hidden-Field-in-ASP.Net-Page.aspx

基本上在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>

这将在您呈现的页面中显示以下输出。

enter image description here

您可以使用以下代码来避免这种情况。

使用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。以下是最终输出 enter image description here

Reference