0

我开始尝试 ViewState。我想使用它的原因是在他或她成功登录时将用户名的值添加到网页(Web Forms Project)中。

我在登录后分配了一个名称,并在成功登录后将用户重定向到 Default.aspx。

ViewState.Add("UserFirstName", name);
Response.Redirect("Default.aspx");

当默认页面加载时,我尝试检索该值并将其分配给 Site.Master 中的标签。

然而,该值为空。

userName = ViewState["UserFirstName"].ToString();
        SiteMaster master = (SiteMaster)Page.Master;
        master.labelInfo = "<strong>Welcome</strong> " + userName;

抱歉,如果我遇到非常无知和缺乏经验的情况,但是在不使用 QueryStrings 或 Session 变量的情况下维护此用户名值的最佳解决方案是什么?

4

3 回答 3

3

仅当您停留在同一页面内时,才会维护 ViewState。这就是为什么当您重定向到另一个页面时,该值为 NULL。ViewState 保存在页面内的 base-64 编码隐藏字段中。对于您正在尝试做的事情,Session将是一个更好的选择:

Session["Username"]=name;
Response.Redirect("Default.aspx");

然后继续Default.aspx

string name = Session["Username"];
于 2013-06-10T16:03:28.290 回答
1

由于您明确不想使用 Session 变量(这确实是最好的方法),您唯一的其他选择是在用户登录时设置一个 cookie 以存储用户名,并读取该 cookie在随后的每个页面上 - 当然这与使用会话状态没有太大区别(而且安全性要低得多,因为这是值得的)。

于 2013-06-10T16:04:33.653 回答
1

正如其他人提到的,ViewState 是通过嵌入在 HiddenField 中的编码数据来维护的。一旦您离开 HiddenField 显然不再可用的页面。

我分享你对 Session 变量的厌恶,尽管 Session 是最好的方法。您可以使用 MVC 中的一个概念,尽管您必须实现它,称为 TempData。这个想法基本上是包装一个保存在 Session 中的字典,这样每次读取都会标记要清除的条目,或者每次页面加载都会杀死整个 TempData 字典。

由于 Session 本质上是一个全局变量,其内容永远不会超出范围,因此(我认为)类似 TempData 的解决方案更适合将信息从一个页面传输到下一个页面,因为一旦你完成它,它基本上就会超出范围。

于 2013-06-10T16:11:52.230 回答