无论子视图是什么,我们都需要将动态数据传递给我们的布局文件。例如,我们在布局的标题中显示一些用户特定的数据。跨所有子视图的ASP.NET MVC 3布局ViewBag数据
我们如何将这些数据传递给布局视图而不需要每个动作独立提供?我们应该使用自定义控制器还是有更好的解决方案?
无论子视图是什么,我们都需要将动态数据传递给我们的布局文件。例如,我们在布局的标题中显示一些用户特定的数据。跨所有子视图的ASP.NET MVC 3布局ViewBag数据
我们如何将这些数据传递给布局视图而不需要每个动作独立提供?我们应该使用自定义控制器还是有更好的解决方案?
,我用的是有来自所有我的视图模型的推导基础视图模型的策略。我使用了一个基本控制器,尽管你也可以使用全局过滤器,并覆盖OnActionExecuted。当我检测到一个返回ViewResult的动作时,我将模型转换到我的基本视图模型,并从基础控制器设置模型的公共属性。
全局过滤器和基础控制器之间的选择取决于各种因素。如果它确实适用于所有操作(返回查看结果),并且您不需要注入来访问某些资源,那么我可能会使用过滤器。如果您需要注入依赖关系,或者您有一些控制器将数据应用于其他应用程序,而其他应用程序则不需要(比如管理员控制器),那么我会转到基础控制器路由。如果你使用它,你需要记得从控制器派生出来。
如果您不想从普通视图模型派生出来,也可以对ViewBag执行相同的操作。我喜欢有强类型的模型,但是YMMV。
你能提供任何链接到代码吗?我对此非常感兴趣,并理解了你的答案,但没有提供如何实现这一点的线索。 – 2013-11-10 17:42:41
看看Razor项目中的标准登录控件 - 这些部分视图访问用户数据 - 可能完全如你所愿。
例如一个典型的LogonPartial.cshtml可能包含:
@if(Request.IsAuthenticated) {
<text>Welcome <b>@Context.User.Identity.Name</b>!
[ @Html.ActionLink("Log Off", "LogOff", "Account") ]</text>
}
else {
@:[ @Html.ActionLink("Log On", "LogOn", "Account") ]
}
如果我们必须访问默认情况下从Context中不可用的非用户数据,该怎么办? – 2011-03-05 22:53:59
您可以在_layout文件中使用@ Html.Action(“ActionName”,“ControllerName”)。
下面是这篇文章: http://haacked.com/archive/2009/11/18/aspnetmvc2-render-action.aspx
比在隐藏在代码后面的覆盖更容易阅读。 – RayLoveless 2015-02-04 05:50:26
我认为核心的为您解决问题的最好办法是使用第送达。
http://weblogs.asp.net/scottgu/archive/2010/12/30/asp-net-mvc-3-layouts-and-sections-with-razor.aspx
您可以定义部分,然后如果你使用IoC和
更新它们,这里有一个博客,我写不久前展示了独特的方法:http://crazorsharp.blogspot.com /2011/03/master-page-model-in-aspnet-mvc-3-using.html – BFree 2011-06-23 18:03:20