2011-03-23 71 views
4

我開始在asp.net MVC一個新網站,該變化取決於用戶提供一個動態的菜單。但那不是全部。我根據用戶使用2種不同的佈局(Razor佈局),2種不同的佈局有不同的菜單。所以我有兩種不同的佈局和兩種不同的動態菜單。視圖模型和動態菜單的最佳實踐 - ASP.NET MVC

我想用相同的視圖爲2點的佈局,每個視圖中的一個視圖模型。我使用動作過濾器來確定佈局。設計一個包含數據以顯示兩個菜單的「ViewModel」基類是個好主意(即使每次只創建一個菜單),併爲我的所有視圖模型(每個視圖一個視圖模型)創建此基類的子項。

我想知道,如果它是一個很好的做法。在這種情況下,我應該使用2視圖(每個佈局一個)並使用公共部分的部分視圖?

,如果有什麼我想顯示對取決於佈局的觀點有些差異,我應該使用2次,而不是一個?

任何推薦?

回答

7

在我看來,最好的做法是有一個視圖模型視圖,包含若干對象,決定了你的動態菜單是如何形成的一個屬性。例如:

public class MyViewModel 
{ 
    public int SomeData { get; set; } // basic Stuff 
    public IDynamicMenuData MenuData { get; set; } 
} 

會根據您想要呈現該用戶的菜單分配動態菜單數據的實現您的視圖模型。然後,在您的視圖中,您可以調用:

@Html.DisplayFor(x => x.MenuData) 

您想要何種動態菜單。然後,您可以爲每種類型的IDynamicMenuData實現創建一個顯示模板,並相應地進行渲染。然後,你只需要一個視圖,一個視圖模型,並且你可以有X個動態菜單的實現。

0

我想用兩個觀點與用的if/else邏輯歸結爲代碼重用的單一視圖。如果兩個菜單非常不同,那麼我會建議創建兩個視圖。如果除了少數菜單項外,菜單大部分都是相同的,那麼我只會用一些if/else邏輯來使用單個視圖。

2

我強烈建議不要使用帶有菜單屬性的基本視圖模型,因爲它非常嚴格。 (例如,如果您使用部分視圖會發生什麼情況?如果您想將模型序列化爲JSON for AJAX,會怎麼樣?如果您忘記從基地繼承,會發生什麼情況?)相反,我建議爲您的應用程序創建單獨的視圖模型菜單可以存儲在ViewData集合中。在你的過濾器中做這件事。

如果你最終使用基本模型,here是另一個有很好例子的答案。