我有一种神秘的方法。
运行此工作正常;
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按预期运行。
这让我完全不解。我该如何继续解决这个问题?
答案 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=18和http://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));