ASP.NET MVC 3布局所有子视图中的ViewBag数据

时间:2011-03-05 22:43:35

标签: .net asp.net asp.net-mvc-3 razor

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

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

4 个答案:

答案 0 :(得分:9)

我使用的策略是拥有一个基本视图模型,我的所有视图模型都是从该模型中派生出来的。我使用基本控制器,但您也可以使用全局过滤器,并覆盖OnActionExecuted。当我检测到返回ViewResult的动作时,我将模型转换为我的基本视图模型,并从基本控制器设置模型的公共属性。

全局过滤器和基本控制器之间的选择取决于多种因素。如果它确实适用于所有操作(返回视图结果)并且您不需要注入来访问某些资源,那么我可能会使用过滤器。如果您需要注入依赖项,或者您有一些控制器将应用数据,而其他控制器则不应用(例如Admin控制器),那么我将使用基本控制器路由。如果你选择它,你需要记住从控制器派生出来。

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

答案 1 :(得分:7)

您可以在_layout文件中使用@ Html.Action(“ActionName”,“ControllerName”)。

这是关于此的文章: http://haacked.com/archive/2009/11/18/aspnetmvc2-render-action.aspx

答案 2 :(得分:2)

看一下Razor项目中标准的登录控件 - 这些部分视图访问用户数据 - 可能与您想要的完全一样。

e.g。典型的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") ]
}

答案 3 :(得分:1)

我相信使用Sections可以最好地解决您的问题的核心。

http://weblogs.asp.net/scottgu/archive/2010/12/30/asp-net-mvc-3-layouts-and-sections-with-razor.aspx

您可以定义部分,然后使用

更新它们