【问题标题】:ASP.NET MVC 3 layout ViewBag data across all child views跨所有子视图的 ASP.NET MVC 3 布局 ViewBag 数据
【发布时间】:2011-03-05 22:43:34
【问题描述】:

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

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

【问题讨论】:

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


【解决方案1】:

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

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

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

【讨论】:

  • 你能提供任何代码链接吗?我对此非常陌生,并且理解您的回答,但不知道如何实现这一点。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 如果我们必须访问在上下文中默认不可用的非用户数据怎么办?
    【解决方案4】:

    我相信使用 Sections 最能解决您的问题。

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

    您可以定义部分,然后使用更新它们

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-17
      • 1970-01-01
      相关资源
      最近更新 更多