在每个视图上放置模型

时间:2016-07-28 12:31:35

标签: asp.net asp.net-mvc asp.net-mvc-5

我试图将我的UserModel传递给每个视图,因此它可以显示当前用户信息。

这是我的 BaseViewModel

public class BaseViewModel
{
    public UserModel currentUser { get; set; }
}

BaseController:

public class BaseController : Controller
{
    protected override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        UserRepository userRep = new UserRepository();
        BaseViewModel model = new BaseViewModel
        {
            currentUser = userRep.getCurrentUser()
        };
        base.OnActionExecuted(filterContext);
    }
}

HomeController:(默认)

public class HomeController : BaseController
{
    public ActionResult Index()
    {
        ListRepository listRep = new ListRepository();
        return View(listRep.GetAllLists());//returns IEnumerable<ListModel>
    }
}

我的共享 _layout.cshtml

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>@ViewBag.Title - My ASP.NET Application</title>
    @Styles.Render("~/Public/css")
</head>
<body>
        <header>
            @Html.Partial("_Header")
        </header>
    @RenderBody()
</body>
</html>

最后,我的 _Header.cshtml:

<div id="logo">
    <h1>Hello @Model.currentUser.username</ h1 >
</div>

但是当我运行它时会收到此错误消息:

  

&#39; System.Collections.Generic.List&#39;不包含&#39; currentUser&#39;

的定义

我认为我的BaseViewModel总是会附加

3 个答案:

答案 0 :(得分:2)

视图中的模型是IEnumerable<ListModel>,除非您指定模型,否则将传递给部分模型,例如,使用

@Html.Partial("_Header", someOtherModel)

相反,请创建一个ChildActionOnly方法,将您的用户数据返回到_Header.cshtml局部视图,并在主视图中使用@Html.Action()进行渲染

[ChildActionOnly]
public ActionResult _Header()
{
   var model = .... // get the model you want to render in the partial
   return PartialView(model);
}

并在主视图中

@{ Html.RenderAction("_Header", controllerName); }

答案 1 :(得分:2)

如果你想在每个视图中使用它,你可以考虑使用Html.Action调用子动作方法。

所以替换

<header>@Html.Partial("_Header")</header>

<header>@Html.Action("Header","YourControllerName")</header>

现在有一个名为Header的动作方法,您可以将所需的数据传递给它的局部视图

[ChildActionOnly]
public ActionResult Header()
{
  var vm = new YourHeaderViewModel();
  vm.UserName="Shyju"; // Replace with whatever you want.
  return PartialView(vm);
}

其中YourHeaderViewModel是标题的查看模式,包含标题所需的属性。

public class YourHeaderViewModel
{
  public string UserName {set;get;}
}

现在在您的Header局部视图中,它是强类型的YourHeaderViewModel类,

@model YourHeaderViewModel
<div id="logo">
    <h1>Hello @Model.UserName</ h1 >
</div>

答案 2 :(得分:0)

使用BaseController的另一种可能的解决方案。

在OnResultExecuting方法中实例化您的BaseViewModel模型,而不是OnActionExecuted。并将模型保存在ViewData中以在_Header局部视图中访问它。

E.g。

public class BaseController : Controller
    {
        protected override void OnResultExecuting(ResultExecutingContext filterContext)
        {
        UserRepository userRep = new UserRepository();
        BaseViewModel model = new BaseViewModel
        {
            currentUser = userRep.getCurrentUser()
        };
        filterContext.Controller.ViewData["customData"] = model;
        }
    }

现在您需要将ViewData传递给_Header局部视图。

E.g。

@Html.Partial("_Header", ViewData["customData"])

在_Header局部视图中,您只需访问数据。

<div id="logo">
    <h1>Hello @Model.currentUser.username</ h1 >
</div>