如何在 ASP.NET MVC 中使用分部视图?

How to use Partial Views in ASP.NET MVC?

我正在构建一个 ASP.NET MVC 应用程序并希望使用局部视图来显示我的产品类别。这将是一个网上商店,在每个页面的菜单栏下方,我想显示另一个包含所有产品类别的栏。

我想为此使用部分视图。目前在 ~/Views/Categories 我创建了局部视图 _CategoriesHeader.cshtml。 (我通过在 "Create New View" 对话框中选择 "Partial View" 来做到这一点,所以它实际上是局部视图)

_CategoriesHeader.cshtml内容如下:

@model IEnumerable<Webshop.Models.Category>

@{
    Layout = null;
}

<ul>
    @foreach (var category in Model)
    {
        <li>@Html.ActionLink(category.Name, "Category", "Categories", new { ID = category.CategoryID }, null)</li>

    }
</ul>

现在在 ~/Views/Shared/_Layout.cshtml 我添加了以下代码:

@Html.Partial("~/Views/Categories/_CategoriesHeader.cshtml", new Webshop.DAL.ShopContext().Categories.ToList())

我想知道这是否是使用需要模型的局部视图的正确方法。现在它只是内联创建一个新的 DbContext 对象来获取所有类别,但我认为最好有一个模型。 但我不知道该怎么做。我做了一些事情,其中​​ CategoriesController.cs 有一个方法用于这个部分视图,但那没有用,因为包含视图已经加载了自己的模型。

没有。您不应在视图内执行任何 DAL 操作。我实际上建议只使用 ifforeach 和类似的语句。没有其他的。在您的控制器中准备好您的数据并将其传入。

您应该将 new Webshop.DAL.ShopContext().Categories.ToList() 放入主视图中使用的模型中,并将其传递给局部视图。

@Html.Partial("~/Views/Categories/_CategoriesHeader.cshtml", Model.Categories)

如果要在列表中呈现数据,您可能需要 foreach

如果你想为每个页面都这样做,你应该创建一个新的动作,并让该动作呈现,而不是局部视图。 (该操作应调用局部视图)。该操作可以获取所需的信息并将其传递到视图。

@Html.Action("CategoriesHeader")

另一种方法是 return 来自控制器的部分视图。您的控制器操作将负责将模型加载到局部视图中。您的控制器代码将如下所示:

public PartialViewResult GetYourPartialView(string id)
        {
            var vm = new yourviewmodel();          
            return PartialView("_YourPartialView", vm);
        }

现在,您已经加载了局部视图。

使用子操作。

ShopController.cs

[ChildActionOnly]
public ActionResult CategoryList()
{
    var categories = new Webshop.DAL.ShopContext().Categories.ToList();
    return PartialView("_CategoryList", categories);
}

_CategoryList.cshtml

@model IEnumerable<Webshop.Models.Category>

<ul>
    @foreach (var category in Model)
    {
        <li>@Html.ActionLink(category.Name, "Category", "Categories", new { ID = category.CategoryID }, null)</li>

    }
</ul>

_Layout.cshtml

@Html.Action("CategoryList", "Shop")

你可以做的是使用Html.Action或Html.RenderAction。 这避免从 View 调用任何 DAL。您的控制器大多数将操作注释为 ChildActionOnly,并且在操作内部,如上面的回答评论,使用 return PartialView。