在 PHP 中,我们可以在 session 中存储/访问关联数组。 我如何使用 asp.net mvc4 访问它们。
我在 session 中设置变量如下:
Session["User"] = new { UserName = "abc", Email= "a@a.com", UserType="User" };
我需要一些机制来访问像 UserName 表单 session “用户”这样的值 -
string user = Session["User"]["UserName"]
有什么想法吗?
最佳答案
在您的示例中,您放入 session 中的不是动态对象,而是匿名类的实例。然而,这是行不通的,因为为了在从 session 中读取对象时访问对象的属性,您必须将其转换为正确的类型,在本例中为匿名类。因为您不知道匿名类的名称(这就是它是匿名的原因),所以您不能执行此转换。 解决这个问题的方法有以下三种:
- 使用命名类
- 使用字典
- 使用动态对象
1。使用命名类
这个非常简单,只需创建一个具有您需要的属性的类(或结构):
public class UserData {
public string UserName {get; set;}
public string Email {get; set;}
public string UserType {get; set;}
}
然后使用这个类的实例来存储 session 中的数据:
Session["User"] = new UserData {UserName = "abc", Email= "a@a.com", UserType="User"};
并像这样访问它:
var user = (UserData)Session["User"];
var userName = user.UserName;
在这种情况下,您失去了“活力”,因为您必须预先声明所有属性,但作为返回,您会得到一些编译时检查,这是一件好事。除非有充分的理由存储动态值,否则我会选择此解决方案。
2。使用字典
在这里你存储了一个 Dictionary<string, string>
在 session 中:
Session["User"] = new Dictionary<string, string> {{"UserName", "abc"}, {"Email", "a@a.com"}, {"UserType", "User"} };
并访问它:
var userDict = (Dictionary<string, string>)Session["User"];
var userName = userDict["UserName"];
3。使用动态对象
这与使用字典没有太大区别,因为它不提供编译时类型检查,但提供了更好的语法。
dynamic userData = new ExpandoObject();
userData.UserName = "abc";
userData.Email = "a@a.com";
userData.UserType = "User";
Session["User"] = userData;
或者,正如@James 在评论中指出的那样,您也可以在此处使用匿名类型,就像您在原始示例中使用的那样:
Session["User"] = new {UserName="abc", Email="a@a.com", UserType="User"};
并访问它:
dynamic userData = Session["User"];
var userName = userData.UserName;
关于asp.net - 如何访问存储在 session 中的动态对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21795188/