我正在构建一个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
有一个方法用于这个局部视图,但这不起作用,因为包含视图已经加载了自己的模型。
答案 0 :(得分:4)
没有。您不应在视图中执行任何DAL操作。我实际上建议只使用if
,foreach
和类似的陈述。没有其他的。在控制器中准备数据并传入。
您应该将new Webshop.DAL.ShopContext().Categories.ToList()
放入主视图中使用的模型中,并将其传递给局部视图。
@Html.Partial("~/Views/Categories/_CategoriesHeader.cshtml", Model.Categories)
如果要在列表中呈现数据,则可能需要foreach
。
如果要对每个页面执行此操作,则应创建一个新操作,并让该操作呈现,而不是部分视图。 (该动作应调用局部视图)。该操作可以获取所需信息并将其传递到视图中。
@Html.Action("CategoriesHeader")
答案 1 :(得分:2)
使用子操作。
<强> 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")
答案 2 :(得分:1)
你可以做的是使用Html.Action或Html.RenderAction。 这可以避免从View中调用任何DAL。您的控制器大多数都将操作注释为ChildActionOnly,并且在操作中,如上面的答案注释,使用返回PartialView。
答案 3 :(得分:0)
另一种方法是从控制器返回局部视图。您的控制器操作将负责将模型加载到局部视图中。您的控制器代码将如下所示:
public PartialViewResult GetYourPartialView(string id)
{
var vm = new yourviewmodel();
return PartialView("_YourPartialView", vm);
}
现在,您已经有了一个加载的局部视图。