我开始尝试使用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变量的情况下维护此用户名值的最佳解决方案是什么?
答案 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的解决方案(我认为)更好地将信息从一个页面传输到下一个页面,因为它一旦完成就基本上用完了范围用它。