代码之家  ›  专栏  ›  技术社区  ›  Kerido

完全删除特定页面的视图状态

  •  16
  • Kerido  · 技术社区  · 15 年前

    我有一个网站,有一些页面不需要任何回发功能。它们只是显示 静止的 甚至没有任何相关的代码。但是,由于母版页具有 <form runat="server"> 包装所有物品的标签 ContentPlaceHolder s,生成的HTML始终包含 对象 字段,即:

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

    编辑: 我试过两种不同的设置 EnableViewState 在完全没有运气的页面级别:

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

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

    8 回复  |  直到 15 年前
        1
  •  23
  •   Ken Forslund    11 年前

    您可以重写render并使用regex将其去掉。

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

    [编辑:此函数还可用于通过更改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);
    }
    
        2
  •  17
  •   jimjim    14 年前

    向页面添加以下方法:

            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="" />
    
        3
  •  4
  •   Jamie Chapman    15 年前

    在<%@页中…在页面顶部添加enableViewState=“false”指令。这将阻止该特定页的视图状态。

        4
  •  3
  •   Sezen    14 年前

    马丁建议的方法必须非常小心地使用;因为正如马丁在括号中指出的那样,它可能会在你的页面中引起意想不到的行为。我真的经历过。但是还有另一个选项可以安全地从页面中删除viewstate内容。

    此选项使您能够在不设置false的情况下使用viewstate,还允许您将其从页面中删除。请检查以下物品:

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

    2 http://aspalliance.com/72

    在彼得的文章[1]下面有一个压缩的解决方案文件,你可以下载。我建议你阅读彼得也提到的第二篇文章。这是一个完美的解决方案,可以在使用其功能时从页面中删除viewstate内容。

        5
  •  2
  •   Community CDub    7 年前
        6
  •  1
  •   Mark    10 年前

    在.net4中,您只需删除 runat="server" form 标签。但不能在 形式 移除后标记。

        7
  •  0
  •   jcarrenog    11 年前

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

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

        8
  •  0
  •   andym0908    10 年前

    或者使用简单的jquery行删除字段,如果您使用的是Ajax样式的回发请求…

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

    这将删除包含隐藏视图状态字段的DIV。