如何填充部分视图以在每个页面上显示

时间:2011-05-16 17:14:16

标签: model-view-controller asp.net-mvc-3

这可能是一个愚蠢的问题,但我试图弄清楚如何为显示登录用户DisplayName的部分视图填充ViewModel。此部分视图位于主要布局中,因此它将位于每个页面上。听起来很简单我知道;但是对于我的生活,我无法找到将数据传输到View的最佳方法。我如何坚持这种观点?

2 个答案:

答案 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)

您可以考虑使用子操作方法。