我试图将我的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
总是会附加
答案 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>