完全删除特定页面的ViewState

时间:2010-03-12 13:24:11

标签: asp.net optimization viewstate

我有一个网站,其中包含一些不需要任何回发功能的网页。它们只显示静态 HTML,甚至没有任何相关代码。但是,由于母版页的<form runat="server">标记包含了所有ContentPlaceHolder,因此生成的HTML始终包含 ViewState 字段,即:

<input
  type="hidden"
  id="__VIEWSTATE"
  value="/wEPDwUKMjEwNDQyMTMxM2Rk0XhpfvawD3g+fsmZqmeRoPnb9kI="
/>

编辑:我尝试了在页面级设置EnableViewState的两种变体,但根本没有运气:

<%@ Page Language="C#" EnableViewState="false" %>
<%@ Page Language="C#" EnableViewState="true" %>

我意识到,在解密时,input字段的此值对应于我无法删除的<form>标记,因为它位于我的母版页上。但是,我仍然希望删除仅显示静态HTML的页面的ViewState字段。有可能吗?

8 个答案:

答案 0 :(得分:23)

您可以覆盖渲染并使用正则表达式将其剥离。

按要求提供样品。 (注意:这样做的开销几乎肯定会超过任何可能的好处!)

[编辑:此功能对于剥离所有隐藏的输入框非常有用,可以通过更改MIMEType和文件扩展名将HTML输出用作word文档]

protected override void Render(HtmlTextWriter output)
{
    StringWriter stringWriter = new StringWriter();

    HtmlTextWriter textWriter = new HtmlTextWriter(stringWriter);
    base.Render(textWriter);

    textWriter.Close();

    string strOutput = stringWriter.GetStringBuilder().ToString();

    strOutput = Regex.Replace(strOutput, "<input[^>]*id=\"__VIEWSTATE\"[^>]*>", "", RegexOptions.Singleline);

    output.Write(strOutput);
}

答案 1 :(得分:18)

在页面中添加以下方法:

        protected override void SavePageStateToPersistenceMedium(object state)
    {
        //base.SavePageStateToPersistenceMedium(state);
    }

    protected override object LoadPageStateFromPersistenceMedium()
    {
        return null; //return base.LoadPageStateFromPersistenceMedium();
    }

    protected override object SaveViewState()
    {
        return null;// base.SaveViewState();
    }

结果:

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

答案 2 :(得分:4)

在页面顶部的&lt;%@page ...指令中,添加EnableViewState =“False”。这将阻止该特定页面的ViewState。

答案 3 :(得分:3)

马丁建议的方法必须非常小心;因为它可能会在你的页面中引起意想不到的行为,正如Martin在括号中所指出我实际上经历过它。但是还有另一种方法可以安全地从页面中删除视图状态内容。

此选项使您能够在不设置false的情况下使用viewstate,还允许您从页面中删除它。请查看以下文章:

1- http://www.eggheadcafe.com/articles/20040613.asp

2- http://aspalliance.com/72

在Peter的文章[1]下可以下载解压缩文件。我建议您阅读Peter引用的第二篇文章。这是在使用其功能时从页面中删除视图状态内容的完美解决方案。

答案 4 :(得分:2)

答案 5 :(得分:1)

<。>在.net4中,您只需从runat="server"标记中删除form即可。但是,删除后,您无法在form标记内使用服务器控件。

答案 6 :(得分:0)

仅当页面中存在asp:Form时才添加ViewState。删除表单,不会呈现隐藏字段。

注意:通过执行此操作,您还将放弃使用服务器端事件处理程序或任何类型的PostBack事件。

答案 7 :(得分:0)

如果您正在使用AJAX风格的回发请求,只需使用简单的jQuery行删除字段......

$(".aspNetHidden").remove();

这将删除包含隐藏的__VIEWSTATE字段的DIV。