我道歉,如果这可能是重复,我到处寻找并找不到答案。
我的问题更多的是“最佳做法/惯例” - 问题很多。
所以这是我的情况,我有一个AccountController - >像这样的东西:
public AccountController(IAuthenticationHelper authHelper,
IAccountService accountService)
{
_authHelper = authHelper;
_accountService = accountService;
}
在我的_Layout视图中,我有一个占位符用于当前登录的帐户。为了获取当前登录的帐户,我正在从HttpContext中检索当前用户身份(我在包装类中有这样的,所以我可以对其进行单元测试) - >然后我从DB获取帐户详细信息。
现在这是我的问题,我需要这些数据在_Layout中,我可以做部分视图,期待一个帐户模型 - >把它放在_Layout ......这里是我被卡住的地方,我不喜欢这么多次去数据库的想法,我不喜欢我必须从内部考虑这个小细节的事实所有行动?我在这里错过了什么,我是否想到这个错误?我的概念错了吗?这样做的正确方法是什么? (以可测试的方式,最好)。
非常感谢帮助!
编辑:如果需要,我很乐意提供更多代码。
答案 0 :(得分: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
中使用依赖注入,使其完全可以进行单元测试。
答案 1 :(得分:1)
通常,登录后,我会将相关帐户详细信息存储在Session
中。由于Session
在所有视图中都可用,因此您可以从那里引用它。如果您愿意,还可以从通用视图模型派生,并让您的控制器派生自自定义控制器基础。然后,您可以使用OnActionExecuted
使用Session
或直接从数据库填充帐户详细信息来填充公共视图模型的用户相关部分。