2011-03-02 85 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