我有一个网站,其中包含一些不需要任何回发功能的网页。它们只显示静态 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字段。有可能吗?
答案 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
在Peter的文章[1]下可以下载解压缩文件。我建议您阅读Peter引用的第二篇文章。这是在使用其功能时从页面中删除视图状态内容的完美解决方案。
答案 4 :(得分:2)
总会有一个ViewState。请参阅此相关问题:
Why does __VIEWSTATE hidden field gets rendered even when I have the EnableViewState set to false
答案 5 :(得分:1)
runat="server"
标记中删除form
即可。但是,删除后,您无法在form
标记内使用服务器控件。
答案 6 :(得分:0)
仅当页面中存在asp:Form时才添加ViewState。删除表单,不会呈现隐藏字段。
注意:通过执行此操作,您还将放弃使用服务器端事件处理程序或任何类型的PostBack事件。
答案 7 :(得分:0)
如果您正在使用AJAX风格的回发请求,只需使用简单的jQuery行删除字段......
$(".aspNetHidden").remove();
这将删除包含隐藏的__VIEWSTATE字段的DIV。