如何访问会话中存储的动态对象

时间:2014-02-15 08:27:28

标签: asp.net asp.net-mvc-4 session

在PHP中,我们可以在会话中存储/访问关联数组。 我如何使用asp.net mvc4访问它们。

我已在会话中设置变量,如:

Session["User"] = new { UserName = "abc", Email= "a@a.com", UserType="User" };

我需要一些机制来访问像UserName表单会话“User”这样的值,如 -

string user = Session["User"]["UserName"]

任何想法?

3 个答案:

答案 0 :(得分:2)

在您的示例中,您在会话中放入的内容不是动态对象,而是匿名类的实例。但是这不起作用,因为为了在从会话中读取对象时访问对象的属性,您必须将其强制转换为正确的类型,在本例中为匿名类。由于你不知道匿名类的名称(这就是为什么它是匿名的),你不能做这个演员。 有三种方法:

  1. 使用命名类
  2. 使用字典
  3. 使用动态对象
  4. 1。使用命名类

    这个非常简单,只需创建一个具有所需属性的类(或结构):

    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;
    

    在这种情况下,你放松了“动态”,因为你必须预先声明所有属性,但是你会得到一些编译时检查,这是一件好事。除非有很好的理由存储动态值,否则我会选择此解决方案。

    2。使用字典

    您可以在此处在会话中存储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"];
    

    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;
    

答案 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"];