代码之家  ›  专栏  ›  技术社区  ›  LiamB

MVC部分控制

  •  0
  • LiamB  · 技术社区  · 15 年前

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

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

    实现这一目标的最佳方法是什么?我是否需要将类别模型与其他模型一起传递,以便可以执行renderpartial(“name”,model)synatx?

    2 回复  |  直到 15 年前
        1
  •  0
  •   tvanfosson    15 年前

    实现这一点有两种不同的方法。可以在每个模型中包含类别,也可以将类别存储在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>
    
        2
  •  0
  •   Wyatt Barnett    15 年前

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