Asp.net mvc 部分控制

Asp.net mvc 部分控制,asp.net-mvc,partial-classes,Asp.net Mvc,Partial Classes,好的,我有一个菜单系统和一个菜单(从datavbase字段动态生成),我想在几个视图中包括这个菜单系统,所有视图都使用不同的控制器和模型 <ul> <li><a href="#">All</a></li> <% foreach (var curCat in Model.CategoryList)

好的,我有一个菜单系统和一个菜单(从datavbase字段动态生成),我想在几个视图中包括这个菜单系统,所有视图都使用不同的控制器和模型

<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

有两种不同的方法来实现这一点。您可以在每个模型中包含类别,也可以将类别存储在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>

第三种方式——查看codeplex上的MVC期货,特别是Html.RenderAction方法。然后,您可以创建一个只输出菜单的控制器,让它处理业务。无需污染ViewData