控制者是否可以影响这个
我卡住了! 我的印象是_layout.cshtml文件用于类似MasterPage的内容。 所有内容都呈现在每个页面上。 当然,我想编写用于在该文件中呈现我的侧边栏菜单的代码。
我想从我的数据库动态显示一个类别列表,但是我在将类别的实际模型传递给Layout.cshtml时遇到问题,因为似乎没有控制器实际触及它。
有什么建议么?
否则,请告诉我如何解决这个问题。 过去三天我一直在困扰着我的大脑,仍然没有优雅的解决方案。
我需要:
我在我的智慧结束。 :P 你将如何解决这个问题?
_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
您传递给视图的任何视图模型都会在主页面中自动提供。 如果您不使用RenderAction / Action这是最好的方法,那么您必须在每个动作中创建必要的主页面数据并将其添加到viewdata中 - 或者通过为包含所有主页面数据的强类型视图模型创建公共基类或通过使用viewdata字典。
我强烈建议你尽管采用html.action方法。 通过这种方式,您可以完全分离控制器操作来处理您的类别列表。 此操作可以检索相关的类别数据,并将类别列表usercontrol作为partialview返回,您不必担心会使用此数据污染您的所有其他操作。
正如我所看到的, ViewData
(及其相关的ViewBag,Model等)是针对特定的当前视图 。 您的_Layout.cshtml不是特定于当前视图; 如果每个控制器都必须传递类别数据以及其他需要传递的视图数据,那将会很尴尬。
相反,我所做的是在我的一个帮助程序类中提供一个静态方法,从数据库中检索类别。 我也会在那里做一些缓存,这样我就不必每次都请求数据库。 _Layout.cshtml然后简单地调用这个静态方法。 简单而优雅。
如果你愿意,你可以把它看成是局部视图,使之成为辅助方法,无论如何。
但请注意一点 - 我的自定义错误视图也使用相同的_Layout.cshtml,如果数据库出现故障,您将尝试显示异常。 ASP.NET MVC足够聪明,可以检测到这个并中止处理,但是你留下了一个不起眼的默认错误页面。 我所做的就是围绕这些危险的调用放置try...catch
语句,如果当前页面是错误视图,它会静静地忽略异常。
上一篇: Can a controller influence the
下一篇: Link to RSS/Atom feed, relative, doesn't work in Firefox