0

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

<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?

4

2 回答 2

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>
于 2009-10-06T12:11:55.387 回答
0

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

于 2009-10-06T15:20:25.873 回答