这可能是一个愚蠢的问题,但我试图弄清楚如何为显示登录用户DisplayName的部分视图填充ViewModel。此部分视图位于主要布局中,因此它将位于每个页面上。听起来很简单我知道;但是对于我的生活,我无法找到将数据传输到View的最佳方法。我如何坚持这种观点?
答案 0 :(得分:3)
最好的方法可能是使用子行为和Html.Action helper。
因此,在ASP.NET MVC中,您始终使用视图模型,该模型将表示您愿意在视图中操作/显示的信息:
public class UserViewModel
{
public string FullName { get; set; }
}
然后是控制器:
public class UsersController: Controller
{
// TODO: usual constructor injection here for
// a repository, etc, ..., omitted for simplicity
public ActionResult Index()
{
var name = string.Empty;
if (User.Identity.IsAuthenticated)
{
name = _repository.GetFullName(User.Identity.Name);
}
var model = new UserViewModel
{
FullName = name
};
return PartialView(model);
}
}
相应的局部视图:
@model UserViewModel
{
// Just to make sure that someone doesn't modify
// the controller code and returns a View instead of
// a PartialView in the action because in this case
// a StackOverflowException will be thrown (if the child action
// is part of the layout)
Layout = null;
}
<div>Hello @Model.FullName</div>
然后继续_Layout并包含此操作:
@Html.Action("Index", "Users")
显然,对此代码的下一个改进是避免在每个请求上访问数据库,但是一旦用户登录就将这些信息存储在某个地方,因为它将出现在所有页面上。优秀的地方是例如加密认证cookie的userData部分(如果你当然使用FormsAuthentication),Session,......
答案 1 :(得分:0)
您可以考虑使用子操作方法。