2009-11-11 77 views
5

在我們當前的Asp.net MVC應用程序中,我們有兩個菜單系統,一個位於頂部,一個位於左側。現在我們有一個呈現菜單的局部視圖,但是這樣做的唯一方法是使用每個ViewModel返回菜單項?我們正在嘗試不使用ViewData字典。Asp.net MVC動態菜單系統

我認爲這個問題的答案是肯定的,但我想看看別人怎麼想

回答

3

3個選項:

  1. RenderAction一路。

  2. RenderPartial as Ryan回答。

  3. 一個抽象的MasterViewModel例如。你所有的模型都將繼承這一點。由動作過濾器填充。

3

你可以使用從MVC Future's庫中的渲染操作,如果你想擁有自己的控制器等,爲你的菜單除了從使用主視圖模型。

+1

我相信你指的是來自期貨大會的RenderAction而非RenderPartial。 – 2009-11-11 15:27:33

+0

你是對的,謝謝 - 我已經編輯過這篇文章。 :) – 2009-11-11 15:56:48

1

你基本上有兩種選擇:

  1. 使用視圖模型設置菜單項顯示,他們會從任何視圖中,全部或部分使用。

  2. 創建強類型模型的層次結構,將菜單項放到BaseModel的某處,然後將出現在每個派生模型中。

您可能感興趣的是異步控制器或部分請求。它沒有在ASP.NET MVC中實現,但你可以檢查MVC Contrib社區項目,它有一些支持。

+0

MVC Contrib庫很好,但如果只需要使用MVC Future的庫,那麼使用MVC未來的庫就可以更容易地渲染partials。 – 2009-11-11 15:02:22

0

處理這個問題有很多選擇,但有一種非常直接的方式可以處理這個問題,而不需要重新構建整個應用程序。

我們有類似的問題,其中我們的頁面/部分具有定義明確的ViewData.Model類型,但視圖包含跨多個頁面重用的部分。我們也試圖避免使用ViewDataDictionary。

但是,我們發現您所描述的情況恰恰是我們喜歡使用ViewDataDictionary條目的EXACT場景。我們在我們的應用程序模型中保留了一個靜態的Constants類,該類包含每種類型的常量的內部類,包括ViewData鍵,這樣我們就沒有字符串了,這些東西在任何地方浮動。

然後,我們的Controller動作填充ViewData鍵和另一個頁面內的partial部分檢查是否存在該鍵,並使用該鍵代替ViewData.Model。它使局部工作在任何需要的地方,並保持ViewModel清潔。通過使用常量,我們可以避免原始字符串到處。

0

使用ActionFilter使用所需的菜單信息填充ViewData。僅將它應用於類和/或方法(可能在基本Controller類上,如果需要的話)。在Controller上創建一些擴展方法,用於強制類型訪問ViewData中的數據(如果稍後更改其存儲位置,則透明)。

我最近用類似的方法做了a blog post(我需要一個贊助商名單來顯示在每一頁上)。這可能有助於指引您朝正確的方向發展。

3

您使用的是基本控制器嗎?我發現使用一個,並重寫OnActionExecuting方法幫助我有一箇中心位置來保留我所有的常見頁面邏輯。

0

只需添加到此,RenderAction被添加到MVC2 Beta。