在MVC3中渲染导航

时间:2011-03-02 14:51:21

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

在MVC3中渲染导航的最佳方法是什么?在我的应用程序中,Controller必须决定导航中的内容,但据我所知,无法将模型传递到_Layout文件(导航html所在的位置),以便为其提供此信息。

3 个答案:

答案 0 :(得分:6)

您可以将模型用于您的布局。

  1. 使用您希望布局可用的属性定义基类MyBaseModel。
  2. 让您的模型继承MyBaseModel,并确保填充属性
  3. 让您的布局指定@model MyBaseModel
  4. 使用属性
  5. 另请参阅this blog post,其中遇到类似问题(“我们经常发现自己需要在每个页面中包含相同的信息”)。

答案 1 :(得分:4)

Best是一个相对主观的术语。我通常采用与druttka的答案类似的方法,但另一种选择是使用RenderAction()来调用控制器动作

<div>@Html.RenderAction("action", "controller")</div>

答案 2 :(得分:3)

我将为@ druttka的回答提供一些对照。但大多数情况下,你必须决定你要做出哪些交易。

如果您为视图使用模型,则现在强制执行以下操作:

  1. 每个视图必须是强类型
  2. 每个操作都必须调用该函数来填充视图模型中包含的所有级别的导航
  3. 第一点并不是那么糟糕,因为在典型的非静态站点中很少有页面无论如何都不会从模型派生出来,并且很容易为这些页面创建一个空模型。然而,第二点更令人讨厌。每个函数都必须实例化它自己的模型,然后为模型提供的每个导航级别填充导航属性。这可能非常麻烦,但在OnActionExecuted中可以相当优雅地处理至少导航,而不是特定于给定操作的导航。

    另一种方法是将导航添加到ViewBag。这可以在不强制您为每个视图指定模型的情况下完成,这对于您不需要指定模型的情况非常有用。应该注意的是,asp.net mvc 3中的ViewBag是动态类型的,你不能将其用作lambda函数中的参数,从而阻止你在布局中做@Html.DisplayFor(viewBag => viewBag.MainNav)之类的事情,这是一个真正的拖累。您仍然可以渲染部分并指定适当的DisplayTemplate。