C# 在MVC范例中,我应该在哪里保存用户数据,以便它';它在所有级别都可以访问吗?

C# 在MVC范例中,我应该在哪里保存用户数据,以便它';它在所有级别都可以访问吗?,c#,asp.net-mvc-4,C#,Asp.net Mvc 4,背景: 我是MVC的新手,正在学习如何做事 我想做什么: 我正在尝试使用户数据可用于所有操作 我是如何实现的: 我通过在OnActionExecuting函数中加载用户数据来实现这一点 我遇到的问题: 我不知道在哪里存储我的用户数据以及以后如何检索它(即,在操作期间) 当前代码: 这里我正在加载当前用户 protected override void OnActionExecuting(ActionExecutingContext ctx) { base.OnAction

背景:

我是MVC的新手,正在学习如何做事

我想做什么:

我正在尝试使用户数据可用于所有操作

我是如何实现的:

我通过在OnActionExecuting函数中加载用户数据来实现这一点

我遇到的问题:

我不知道在哪里存储我的用户数据以及以后如何检索它(即,在操作期间)

当前代码:

这里我正在加载当前用户

    protected override void OnActionExecuting(ActionExecutingContext ctx) {
        base.OnActionExecuting(ctx);
        UserAccount user = null;
        using (UsersContext db = new UsersContext()) {
            user = db.UserProfiles.FirstOrDefault(u => u.userName.ToLower() == User.Identity.Name.ToLower());
        }
    }
在这些地方我怎么得到它

    public ActionResult Default() {
        ViewBag.Message = user.userName;  // ????????????
        return View();
    }
可能的解决方案:

  • 只需将其保存在参数中
  • 用户HttpContext(不确定这将如何工作,请帮助)
  • 用户控制器上下文(不确定如何工作,请帮助)
  • 视图状态
  • 取景袋
  • 缓存
  • 任何其他类型的MVC魔术

  • 只要让你的控制器继承一些基本的控制器类就可以了

    public class AccountController : BaseController
    
    然后在BaseController中,您可以自由创建表示用户数据的方法或项目,这些方法或项目将在AccountController的所有操作中可用

    public class BaseController : Controller
    {
          public User CurrentUser
            {
                get
                {
                    if (HttpContext.User == null || HttpContext.User.Identity.AuthenticationType != "Forms")
                        return null;
                    if (Session["CurrentUser"] != null)
                        return (User)Session["CurrentUser"];
                    var identity = HttpContext.User.Identity;
                    var ticket = ((FormsIdentity)identity).Ticket;
                    int userId;
                    if (!int.TryParse(ticket.UserData, out userId)
                        return null;
    
                    using (var db= new DbEntities(connectionString))
                    {
                        Session["CurrentUser"] = db.Users.SingleOrDefault(u => u.ID == userId));
                    }
    
                    return (User)Session["CurrentUser"];
                }
    
            set { Session["CurrentUser"] = value; }
            }
    }
    

    除此之外,您还可以在
    BaseController
    中拥有一个将值写入会话的属性。这样,您的用户信息将在整个会话中可用。我有两个问题:您从哪里获得DbEntities或当前上下文?你把它放在哪里?另外,如何获取connectionString?DbEntities仅用于示例,它是由设计器生成的EntityFramework类,用于访问数据库。您可能希望将EF作为一种可能的ORM(对象关系映射)工具来帮助您。将连接字符串放在web.config文件中,并使用System.Configuration.ConfigurationManager.AppSettings[“YouConnectionStringName”];去拿。看看