繁体   English   中英

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

[英]How to use Partial Views in ASP.NET MVC?

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

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

_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")

使用子操作。

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的动作,并且在动作内部,如上面的回答注释,使用返回PartialView。

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

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

现在,你已经有一个加载的局部视图。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM