控制器可以影响_layout.cshtml文件吗?

时间:2010-12-14 01:20:32

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

我被困住了!我的印象是_layout.cshtml文件用于类似MasterPage的内容。每一页都呈现出一切。当然,我想编写用于在该文件中呈现侧边栏菜单的代码。

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

有什么建议吗?

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

我需要:

  1. 从数据库中动态获取类别列表。
  2. 在每个视图上显示此类别列表。 (因此使用_layout.cshtml)
  3. 优雅地处理每个不同类别的点击。
  4. 我的智慧结束了。 :P 如何解决这个问题?

4 个答案:

答案 0 :(得分:2)

_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

答案 1 :(得分:1)

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

我强烈建议您遵循html.action方法。通过这种方式,您可以使用完全独立的控制器操作来处理类别列表。此操作可以检索必要的类别数据并将categorylist usercontrol作为partialview返回,您不必担心使用此数据污染所有其他操作。

答案 2 :(得分:1)

正如我所看到的,ViewData(以及它的亲戚,如ViewBag,Model等)适用于特定的当前视图。您的_Layout.cshtml并非特定于当前视图;如果每个控制器除了需要为视图传递的其他数据之外还必须传递类别数据,那将是很尴尬的。

相反,我所做的是在我的一个帮助程序类中提供一个静态方法,该方法从数据库中检索类别。我也在那里做一些缓存,这样我就不必在每一个请求上都按下DB。然后_Layout.cshtml只是调用这个静态方法。简单而优雅。

如果你愿意,你可以把它带到局部视图,使其成为帮助方法,无论如何。

但请注意一点 - 我的自定义错误视图也使用相同的_Layout.cshtml,如果数据库关闭,则会出现异常,尝试显示异常。 ASP.NET MVC非常智能,可以检测到这一点并中止处理,但是你会留下一个非描述性的默认错误页面。我所做的是围绕这些危险的调用放置try...catch语句,如果当前页面是错误视图,它会悄悄地忽略异常。

答案 3 :(得分:0)

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