ASP.NET在global.asax中获取视图状态

时间:2009-08-25 20:31:38

标签: asp.net

是否可以访问global.asax文件中的viewstate?我在某些客户端遇到viewstate问题,我想记录viewstate在Application_Error事件中的内容。

2 个答案:

答案 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() 覆盖方法,以便它写出你想看到的信息。