【问题标题】:Completely remove ViewState for specific pages完全删除特定页面的 ViewState
【发布时间】:2010-03-12 13:24:11
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 将静态文件重命名为 .html 或在页面指令中将 EnableViewState 设置为 false。

标签: asp.net optimization viewstate


【解决方案1】:

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

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

[编辑:此函数还可以用于通过更改 MIMEType 和文件扩展名来剥离所有隐藏的输入框,以便将 HTML 输出用作 word doc]

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);
}

【讨论】:

  • NB 应该用粗体书写,20pt 全部大写而不是括号之间。这是 Google 中的顶级结果之一,人们使用此代码,即使他们不应该这样做。我保证。
【解决方案2】:

在页面中添加以下方法:

        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="" />

【讨论】:

  • @Craig :不客气,但我已经远离了 asp 页面和 mvc,我更喜欢 Angularjs 和 webservices,因此不需要 asp.net 中的许多解决方法。
【解决方案3】:

在页面顶部的

【讨论】:

  • 已经是这样了。但是,该领域仍然存在。我更新了问题
【解决方案4】:

Martin 建议的方法必须非常小心地使用;因为它可能会导致您的页面出现意外行为,正如 Martin 在括号中指出的那样。我确实经历过。但是还有另一个选项可以安全地从页面中删除视图状态内容。

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

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

2-http://aspalliance.com/72

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

【讨论】:

    【解决方案5】:

    【讨论】:

    • 根据我的回答 ViewState 可以有一个空值。
    【解决方案6】:

    在 .net4 中,您只需从 form 标记中删除 runat="server"。但是,一旦删除 form 标记,您将无法在其中使用服务器控件。

    【讨论】:

      【解决方案7】:

      仅当页面中存在 asp:Form 时才会添加 ViewState。移除Form,隐藏字段不会被渲染。

      注意:这样做,您也将放弃使用服务器端事件处理程序或任何类型的 PostBack 事件。

      【讨论】:

        【解决方案8】:

        如果您使用的是 AJAX 样式的回发请求,或者只是使用简单的 jQuery 行来删除字段...

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

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

        【讨论】:

        • 简单高效: $(document).ready(function () { setTimeout(function () { $("#__VIEWSTATE").remove(); $("#__VIEWSTATEGENERATOR").remove ();}, 300);});
        猜你喜欢
        • 2021-03-14
        • 2011-07-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多