2009-10-06 32 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。