在PHP中,我们可以在会话中存储/访问关联数组。 我如何使用asp.net mvc4访问它们。
我已在会话中设置变量,如:
Session["User"] = new { UserName = "abc", Email= "a@a.com", UserType="User" };
我需要一些机制来访问像UserName表单会话“User”这样的值,如 -
string user = Session["User"]["UserName"]
任何想法?
答案 0 :(得分:2)
在您的示例中,您在会话中放入的内容不是动态对象,而是匿名类的实例。但是这不起作用,因为为了在从会话中读取对象时访问对象的属性,您必须将其强制转换为正确的类型,在本例中为匿名类。由于你不知道匿名类的名称(这就是为什么它是匿名的),你不能做这个演员。 有三种方法:
这个非常简单,只需创建一个具有所需属性的类(或结构):
public class UserData {
public string UserName {get; set;}
public string Email {get; set;}
public string UserType {get; set;}
}
然后使用此类的实例将数据存储在会话中:
Session["User"] = new UserData {UserName = "abc", Email= "a@a.com", UserType="User"};
并像这样访问:
var user = (UserData)Session["User"];
var userName = user.UserName;
在这种情况下,你放松了“动态”,因为你必须预先声明所有属性,但是你会得到一些编译时检查,这是一件好事。除非有很好的理由存储动态值,否则我会选择此解决方案。
您可以在此处在会话中存储Dictionary<string, string>
:
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"];
这与使用字典没有什么不同,因为它不提供编译时类型检查,但提供了更好的语法。
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;
答案 1 :(得分:1)
您已创建了一个匿名对象,因此您应该能够将其直接转换为dynamic
string user = ((dynamic)Session["User"]).UserName;
答案 2 :(得分:0)
您可以使用字典:Dictionary<string, string>
或Dictionary<string, object>
:
var user = new Dictionary<string, string>();
user.Add("UserName", "abc");
user.Add("Email", "a@a.com");
user.Add("UserType", "User");
Session["User"] = user;
并使用它:
string user = ((Dictionary<string, string>)Session["User"])["UserName"];