完全删除特定页面的ViewState

Ker*_*ido 16 asp.net viewstate optimization

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

<input
  type="hidden"
  id="__VIEWSTATE"
  value="/wEPDwUKMjEwNDQyMTMxM2Rk0XhpfvawD3g+fsmZqmeRoPnb9kI="
/>
Run Code Online (Sandbox Code Playgroud)

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

<%@ Page Language="C#" EnableViewState="false" %>
<%@ Page Language="C#" EnableViewState="true" %>
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ith 23

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

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

[编辑:此功能对于剥离所有隐藏的输入框也很有用,可以通过更改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);
}
Run Code Online (Sandbox Code Playgroud)


Arj*_*ang 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();
    }
Run Code Online (Sandbox Code Playgroud)

结果:

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="" />
Run Code Online (Sandbox Code Playgroud)