2009-10-06 34 views
0

好吧我有一個菜單系統,菜單(從datavbase字段動態生成)我想在多個視圖中包含此菜單系統 - 所有這些都使用不同的控制器和模型。MVC部分控件

<ul> 
      <li><a href="#">All</a></li> 
       <% 
        foreach (var curCat in Model.CategoryList) 
        { 
       %> 
         <li><a href="/messagecentre/category/<%=curCat.CategoryID.ToString() %>"><%= Html.Encode(curCat.Category1)%></a></li>    
       <% 
        } 
       %> 
     </ul> 

最好的方法來實現這一目標?我是否需要將Categories模型與其他模型一起傳遞,以便我可以執行RenderPartial(「Name」,Model)synatx?

回答

0

有兩種不同的方法來實現這一點。您可以在每個模型中包含類別,也可以將類別存儲在ViewDataDictionary中,並從那裏檢索它們。通常情況下,我想用數據擴展模型,以便我可以以強類型的方式使用它,但在這種情況下 - 由於數據無處不在 - 我可能會使用ViewData並使用基本控制器來填充它(可能在OnActionExecuted),以便它始終可用。在我的部分視圖中,我會將ViewData項目轉換爲強類型對象並從此處使用它。

我會這樣做的原因是保持我的模型乾淨的實際視圖,這不需要知道菜單的數據。對我來說,這似乎是創建視圖特定模型的常見途徑的合理例外。

<% var categories = ViewData["categories"] as IEnumerable<Category>; %> 
<ul> 
    <li><a href="#">All</a></li> 
     <% 
    foreach (var curCat in categories) 
    { 
%> 
     <li><a href="/messagecentre/category/<%=curCat.CategoryID.ToString() %>"><%= Html.Encode(curCat.Category1)%></a></li>    
<% 
    } 
%> 
</ul> 
0

第三種方式 - 查看codeplex上的MVC Futures,特別是Html.RenderAction方法。然後你可以創建一個控制器,只需輸出菜單並讓它處理它的業務。不需要污染ViewData。