2011-03-05 81 views
10

无论子视图是什么,我们都需要将动态数据传递给我们的布局文件。例如,我们在布局的标题中显示一些用户特定的数据。跨所有子视图的ASP.NET MVC 3布局ViewBag数据

我们如何将这些数据传递给布局视图而不需要每个动作独立提供?我们应该使用自定义控制器还是有更好的解决方案?

+0

更新它们,这里有一个博客,我写不久前展示了独特的方法:http://crazorsharp.blogspot.com /2011/03/master-page-model-in-aspnet-mvc-3-using.html – BFree 2011-06-23 18:03:20

回答

9

,我用的是有来自所有我的视图模型的推导基础视图模型的策略。我使用了一个基本控制器,尽管你也可以使用全局过滤器,并覆盖OnActionExecuted。当我检测到一个返回ViewResult的动作时,我将模型转换到我的基本视图模型,并从基础控制器设置模型的公共属性。

全局过滤器和基础控制器之间的选择取决于各种因素。如果它确实适用于所有操作(返回查看结果),并且您不需要注入来访问某些资源,那么我可能会使用过滤器。如果您需要注入依赖关系,或者您有一些控制器将数据应用于其他应用程序,而其他应用程序则不需要(比如管理员控制器),那么我会转到基础控制器路由。如果你使用它,你需要记得从控制器派生出来。

如果您不想从普通视图模型派生出来,也可以对ViewBag执行相同的操作。我喜欢有强类型的模型,但是YMMV。

+0

你能提供任何链接到代码吗?我对此非常感兴趣,并理解了你的答案,但没有提供如何实现这一点的线索。 – 2013-11-10 17:42:41

2

看看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") ] 
} 
+1

如果我们必须访问默认情况下从Context中不可用的非用户数据,该怎么办? – 2011-03-05 22:53:59