是否可以访问global.asax文件中的viewstate?我在某些客户端遇到viewstate问题,我想记录viewstate在Application_Error事件中的内容。
答案 0 :(得分:0)
ViewState以名为“__VIEWSTATE”的隐藏输入表单字段发布到服务器。因此,您可以使用以下命令访问序列化的ViewState:
Request.Form["__VIEWSTATE"]
但是如果你查看一个页面的源代码(在你的浏览器中),你会发现ViewState只是一个(长)编码的字符串:
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE"
value="/2RkRMb2dvLnBuZ2Ag0PD..." />
我不确定是否记录该字符串会帮助您找到任何错误。
答案 1 :(得分:0)
我知道这是一个非常古老的话题,但这个问题的答案是肯定的。这是最简单的解决方案。在您的页面中,只要出现错误,您就需要在会话变量中捕获解密/反序列化的视图状态。在您的 .aspx 页面中,或者在您的基本表单中(如果您的页面都继承自一个公共类)添加以下方法:
public void Page_Error(object sender, EventArgs e)
{
Session["ViewStateData"] = this.ViewState;
}
然后在您的 global.asax.cs 类中添加:
protected void Application_Error(object sender, EventArgs e)
{
if (HttpContext.Current != null && HttpContext.Current.Session != null && HttpContext.Current.Session["ViewStateData] != null)
{
StringBuilder sbText = new StringBuilder();
System.Web.UI.StateBag vs = (System.Web.UI.StateBag)HttpContext.Current.Session["ViewStateData"];
sbText.Append("Viewstate Data:\r\n");
foreach (string key in vs.Keys)
{
try
{
sbText.AppendFormat("{0}={1}\r\n", key, vs[key]);
}
catch (Exception)
{ }
}
HttpContext.Current.Session["ViewStateData"] = null;
}
}
请注意 vs[key] 可能是一个复杂的对象,因此您可能需要为某些“键”值添加特殊处理以写出它的属性,或者向该对象添加自定义 ToString() 覆盖方法,以便它写出你想看到的信息。