【问题标题】:Pass list of categories to partial view将类别列表传递给部分视图
【发布时间】:2018-01-02 18:04:24
【问题描述】:

我有一个局部视图,它将显示主要类别的列表以及每个主要类别下的所有子类别。但问题是我不知道如何将这个类别列表传递给我的部分视图。请检查下面的代码。我还附上了我的 .edmx 表格地图图片,以便您更好地了解。一旦我将它传递给部分视图,我想遍历所有类别和子类别以显示它们

[ChildActionOnly]
public PartialViewResult _GuestNav()
{
    using (var db = new TestEntities())
    {
        db.Categories.ToList(); // get list from here

        return PartialView("_GuestNav"); // then pass that list to partial view
    }
}

【问题讨论】:

    标签: asp.net-mvc


    【解决方案1】:

    这里是主要的动作代码:

    public ActionResult Categories()
    {
        using (var dbCtx = new DbContext())
        {
            var categories = dbCtx.Categories.Include(x => x.SubCategories).ToList()
            return View(categories); 
        }
    }
    

    然后在您的Categories.cshtml 中,您将拥有如下代码:

    @model IEnumerable<Categories>
    
    <ul>
        @foreach(var category in Model)
        {
            <li>@category.CategoryName
             @if(category.SubCategories.Any())
             {
                Html.RenderPartial("~/Partial/_SubCategory.cshtml", category.SubCategories); 
             }
             </li>
        }
    </ul>
    

    最后,您在 Category 文件夹的 Partial 文件夹中提供了一个名为 _SubCategory.cshtml 的局部视图,如下所示:

     @model IEnumerable<SubCategory>
     <ul>
        @foreach(var subCategory in Model)
        {
            <li>@subCategory.SubCategoryName</li>
        }
    </ul>
    

    在您的情况下,如果您想将此列表传递给您指定的局部视图,您可以按以下方式进行:

    [ChildActionOnly]
    public PartialViewResult _GuestNav()
    {
        using (var db = new TestEntities())
        {
           var categories = db.Categories.Include(x => x.SubCategories).ToList(); // Added the include if you want to add subcategories as well
            return PartialView("_GuestNav", categories); // then pass that list to partial view
        }
    }
    

    【讨论】:

    • 兄弟没有主动作。我正在从 _Layout.cshtml 调用部分视图
    • 那么在这种情况下使用最后一个示例并根据需要自定义局部视图。切记在局部视图顶部设置@model IEnumerable&lt;Categories&gt;
    【解决方案2】:

    你可以使用模型绑定,将模型或视图模型作为参数传递并从局部视图访问它。例如,在您的 _GuestNav 操作中:

    ...
    return PartialView("_GuestNav",db.Categories.ToList());
    

    这里有一个 link 来说明如何实现这一点。

    然后你可以在你的视图中绑定模型。例如:

    ...
    @model IEnumerable<Categories>;
    

    有关更多详细信息,请查看链接中的示例。

    【讨论】:

    • 您应该包含一个@using 语句,指示Categories 类的完整路径。例如@using PartialViewsSample.ViewModels
    • 请注意,我编辑了我的答案,将 @model List&lt;Categories&gt;; 更改为 @model IEnumerable&lt;Categories&gt;;
    【解决方案3】:

    PartialView 方法有一个接受对象的覆盖。您需要将 db.Categories.ToList() 调用的结果存储在一个变量中,并将其传递给这样的方法:

     using (var db = new TestEntities())
    {
        var cats = db.Categories.Include("SubCategories").ToList(); // get list from here
    
        return PartialView("_GuestNav", cats); // then pass that list to partial view
    }
    

    只需确保您的局部视图需要一个类别列表作为其模型。然后,在您的视图中,您可以遍历模型并显示子类别。

    您还应该研究如何为您的视图使用视图模型。

    编辑

    您可能需要使用 include 语句,因为导航属性通常是延迟加载的。更新了我的答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-09
      • 2017-02-16
      相关资源
      最近更新 更多