.NET方法有令人费解的行为

时间:2011-04-04 15:09:02

标签: c# .net asp.net

我有一种神秘的方法。

运行此工作正常;

FindConcept("Product");

运行此操作会产生(不需要的)不同结果,即使SelCatID的值为“Product”;

FindConcept(SelectedCategoryID);

SelectedCategoryID的位置如下:

 protected string SelectedCategoryID
 {
     get
     {
         if (Request["c"] != null)
         {
             string c = Request["c"];
             ViewState["SelectedCategoryID"] = c;
             return c;
         }

         if (ViewState["SelectedCategoryID"] != null)
         {
             string cid = ViewState["SelectedCategoryID"] as string;
             if (!string.IsNullOrEmpty(cid))
             {
                 return cid;
             }
             return "";
         }
         else
             return "";
     }
}

这让我相信在SelectedCategoryID对象的get方法中必定存在一些奇怪的副作用。我是.NET的新手,所以我不太了解ViewState的工作原理。

我尝试过以多种方式调试它,例如我尝试过这个:

System.Diagnostics.Debug.WriteLine(SelectedCategoryID);
FindConcept(SelectedCategoryID);

debug.writeline将生成“Product”,这应该意味着FindConcept按预期运行。

这让我完全不解。我该如何继续解决这个问题?

1 个答案:

答案 0 :(得分:1)

ASP.NET webforms中的ViewState作为隐藏表单字段写入html(已编码,通常是加密的)。

这意味着视图状态将在回发请求中可用,但不能通过http重定向提供。

在上面的代码中,看起来代码试图处理回发和其他类型的请求 - 因为它使用了Response属性的索引器

  

获取Cookies,Form,QueryString或ServerVariables中的指定对象   http://msdn.microsoft.com/en-us/library/system.web.httprequest.item%28VS.71%29.aspx

一种可能的情况是,您使用上述方法之一重定向而不传递信息,这意味着视图状态不可用,并且该信息在URL查询字符串或cookie等中也不可用。

已编辑 - 示例

这有很多种方式,这是一个简单的例子: 例如,假设您在一个页面上从GridView中的数据库中检索“SelectedCategoryID”。在默认情况下,这将存储在页面的Gridview中,并在发布回同一页面时在视图状态中可用(请参阅http://www.xefteri.com/articles/show.cfm?id=18http://msdn.microsoft.com/en-us/library/ms972976.aspx)。

然而,假设在点击按钮时你做了一些事情以响应按钮点击,例如

Response.Redirect("SomeOtherPage.aspx")

在这种情况下,“SomeOtherPage.aspx”上的ViewState将不会保存该值,因此您的getter将在其他位置查找值,例如url。在这种情况下,您可以传递“SelectedCategorID”以及

之类的内容
Response.Redirect("SomeOtherPage.aspx?c=" + HttpUtility.UrlEncode(selectedCategoryId));