维持国家的最佳解决方案

时间:2013-06-10 16:00:16

标签: c# webforms viewstate

我开始尝试使用ViewState。我想使用它的原因是当用户成功登录时将用户名的值添加到网页(Web窗体项目)。

登录后指定名称,成功登录后将用户重定向到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变量的情况下维护此用户名值的最佳解决方案是什么?

3 个答案:

答案 0 :(得分:3)

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

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

然后在Default.aspx

string name = Session["Username"];

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

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