0

如果这可能是重复,我表示歉意,我到处寻找,找不到答案。

我的问题更像是“最佳实践/惯例”之类的问题。

所以这是我的情况,我有一个 AccountController -> 类似这样的东西:

    public AccountController(IAuthenticationHelper authHelper, 
                             IAccountService accountService)
    {
        _authHelper     = authHelper;
        _accountService = accountService;
    }

在我的 _Layout 视图中,我有一个当前登录帐户的占位符。为了获取当前登录的帐户,我从 HttpContext 中检索当前用户身份(我在一个包装类中,所以我可以对其进行单元测试)-> 然后我从数据库中获取帐户详细信息。

现在这是我的问题,我需要在_Layout中的这些数据,我可能会做一个期望帐户模型的部分视图->将它放在_Layout中......这就是我卡住的地方,我不喜欢这个想法这么多访问数据库,我不喜欢我必须从所有操作中考虑这个小细节的事实?我在这里遗漏了什么,我想错了吗?我的概念错了吗?这样做的正确方法是什么?(最好以可测试的方式)。

非常感谢您的帮助!

编辑:如果需要,我很乐意提供更多代码。

4

2 回答 2

2

你可以Child actions用来实现这一点。例如,您将有一个特定的控制器专门用于检索当前记录的用户详细信息并将它们传递给局部视图:

public class UserInfoController: Controller
{
    [ChildActionOnly]
    public ActionResult Index()
    {
        var model = new UserDetailsViewModel();
        if (User.Identity.IsAuthenticated)
        {
            string username = User.Identity.Name;
            // fetch the user info from the database and populate your view model
            // consider caching this information to avoid multiple round-trips 
            // to the database
        }

        return PartialView(model);
    }
}

那么你当然会有相应的局部视图来显示用户信息。

从你的 _Layout 你可以渲染这个子动作:

@Html.Action("Index", "UserInfo")

当然,为了避免多次往返数据库,您可以简单地缓存此信息。

现在您的主要动作和模型不必担心这个通用功能。它由子操作处理。显然,您可以在其中使用依赖注入UserInfoController来使其完全可单元测试。

于 2013-01-27T14:36:58.910 回答
1

通常,登录后,我将相关帐户详细信息存储在Session. 由于Session在所有视图中都可用,因此您可以从那里引用它。如果您愿意,您还可以从通用视图模型派生,并让您的控制器从自定义控制器库派生。然后,您可以使用来自数据库或直接来自数据库OnActionExecuted的帐户详细信息来填充公共视图模型的用户相关部分。Session

于 2013-01-27T14:34:44.800 回答