2011-03-02 91 views
3

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

回答

6

您可以使模型适用于您的布局。

  1. 定义一个基类MyBaseModel,其中包含要用于布局的属性。
  2. 有你的模型子类MyBaseModel,并确保您填写的属性
  3. 让你的布局指定@model MyBaseModel
  4. 使用性能

参见this blog post哪里有类似的问题(“我们经常发现我们自己需要在每个页面中包含相同的信息“)。

4

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

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

我将提供一些counterpoints到@ druttka的答案。但大多数情况下,你必须决定你想做什么交易。

如果您使用您的视图模型,你现在迫使两两件事:

  1. 每个视图必须是强类型
  2. 每一个动作都要调用该函数来填充包括导航各级在您的视图模型

第一点是没有那么糟糕,因为在一个典型的非静态网站这不会从模型中派生反正非常几页,它很容易创建一个空模型fo那些页面。然而,第二点更令人讨厌。每个函数都必须实例化它自己的模型,然后填充模型提供的每个导航级别的导航属性。这可能非常麻烦,但可以在OnActionExecuted中对至少nav进行相当优雅的处理,这不是特定于给定操作的。

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

+0

公平地说,对于我的个人网站,我使用基础模型进行布局,每个视图都有一个来自它的模型。这并不完美,但是每次你认为MVC都有问题时,只要做一点工作就可以实现扩展。 – 2011-03-02 15:54:31

+0

+1是一个很好的选择。我在大多数情况下更喜欢这种方式,但最近被要求避免使用ViewBag并保留强类型的视图,所以这是我的头脑所在。 – 2011-03-02 15:54:34