ASP.NET MVC 帮助程序以实现常见功能

本文关键字:实现 常见 功能 帮助程序 NET MVC ASP | 更新日期: 2023-09-27 17:56:08

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

我的问题更像是一个"最佳实践/惯例"类型的问题。

所以这是我的情况,我有一个帐户控制器 ->这样的东西:

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

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

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

非常感谢帮助!

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

ASP.NET MVC 帮助程序以实现常见功能

您可以使用

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中使用依赖注入来使其完全可进行单元测试。

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