2

背景:

我是 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();
    }

可能的解决方案:

  1. 只需将其保存在参数中即可。
  2. 用户 HttpContext(不确定这将如何工作,请帮助)。
  3. 用户 ControllerContext (不确定这将如何工作,请帮助)。
  4. 视图状态?
  5. 查看包?
  6. 缓存?
  7. 任何其他类型的 MVC 魔法
4

1 回答 1

3

只需让您的控制器继承一些像这样的基本控制器类

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; }
        }
}
于 2013-03-06T15:01:57.203 回答