【问题标题】:Can a controller influence the _layout.cshtml file?控制器可以影响 _layout.cshtml 文件吗?
【发布时间】:2010-12-14 01:20:32
【问题描述】:

我被困住了!我的印象是 _layout.cshtml 文件用于类似 MasterPage 的内容。那里的所有内容都呈现在每个页面上。自然,我想编写代码以在该文件中呈现我的侧边栏菜单。

我想动态显示我的数据库中的类别列表,但我在将类别的实际模型传递给 Layout.cshtml 时遇到问题,因为似乎没有控制器实际接触它。

有什么建议吗?

否则请告诉我如何解决这个问题。在过去的三天里,我一直在绞尽脑汁,仍然没有优雅的解决方案。

我需要:

  1. 从数据库中动态获取类别列表。
  2. 在每个视图上显示此类别列表。 (因此使用 _layout.cshtml)
  3. 优雅地处理每个不同类别的点击。

我已经束手无策了。 :P将如何解决这个问题?

【问题讨论】:

  • 您在过去几天里提出了许多与此相关的问题,并提供了许多解决方案,包括 1) RenderPartial 2) RenderAction 3) ViewData 4)全局操作过滤器等​​。您是否尝试过其中任何一种,它们如何不符合您的要求?
  • 归结为 layout.cshtml 文件无法使用传递的模型,因为没有控制器对其进行操作。有什么建议吗?
  • “没有控制器对其进行操作”是什么意思?控制器创建/获取视图模型并将其传递给视图。 Thew 视图(无论是内容还是主视图)然后执行任何它想要显示视图模型对象包含的内容。如果控制器传入模型,则视图可以访问它。
  • 每个人似乎都忽略了我的问题,只是吐出教科书材料。我正在使用 _Layout.cshtml 文件,而不是常规视图。没有控制器对此采取行动。不过,我已经找到了解决方案,Lorenzo 已经帮我解决了。我为 HtmlHelper 创建了一个扩展方法,现在我可以调用类别了。
  • 我不认为每个人都忽略了你的问题。我只是觉得你问错了问题。

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


【解决方案1】:

_layout.cshtml

@if(isSectionDefined("Categories"))
{
    <div id="sidebar">
      @RenderSection("Categories", required: false )
    </div>
}

index.cshtml

@section Categories {
<ul>
  <li>Category One</li>
  <li>Category Two</li>
  <li>Category Three</li>
</ul>
}

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

【讨论】:

    【解决方案2】:

    您传递给视图的任何视图模型都会自动在您的母版页中可用。如果您不使用最佳方法 RenderAction/Action,那么您必须在每个操作中创建必要的母版页数据并将其添加到 viewdata - 或者通过为包含所有母版页数据的强类型视图模型创建一个公共基类或使用 viewdata 字典。

    我强烈建议您采用 html.action 方法。这样,您就有了一个完全独立的控制器操作来处理您的类别列表。此操作可以检索必要的类别数据并将类别列表用户控件作为部分视图返回,您不必担心这些数据会污染所有其他操作。

    【讨论】:

    【解决方案3】:

    在我看来,ViewData(以及它的亲戚,如 ViewBag、Model 等)适用于特定的当前视图。您的 _Layout.cshtml 并非特定于当前视图;如果每个控制器都必须传递类别数据以及它需要传递给视图的任何其他数据,那将是很尴尬的。

    相反,我所做的是在我的一个助手类中提供一个静态方法,该方法从数据库中检索类别。我还在那里做了一些缓存,这样我就不必在每个请求上都访问数据库。 _Layout.cshtml 然后简单地调用这个静态方法。简洁大方。

    如果你愿意,你可以把它带到局部视图中,让它成为一个辅助方法,无论如何。

    但请注意 - 我的自定义错误视图也使用相同的 _Layout.cshtml,如果数据库出现故障,您会在尝试显示异常时遇到异常。 ASP.NET MVC 足够聪明,可以检测到这一点并中止处理,但您会得到一个不起眼的默认错误页面。我所做的是在这些危险调用周围放置try...catch 语句,如果当前页面是错误视图,它们会悄悄地忽略异常。

    【讨论】:

      【解决方案4】:

      通过让我的 ViewModel 实现一个接口,该接口具有包含菜单数据的成员,我已经实现了类似的功能。在我的操作方法中,我设置了该数据。然后在我看来,我检查我的视图模型是否实现了该接口,拉出菜单数据并渲染菜单(实际上是在部分视图中)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-05-19
        • 1970-01-01
        • 2020-01-18
        • 2015-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多