【问题标题】:How to use Partial Views in ASP.NET MVC?如何在 ASP.NET MVC 中使用局部视图?
【发布时间】:2015-03-19 15:18:52
【问题描述】:

我正在构建一个 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 有这个局部视图的方法,但这不起作用,因为包含的视图已经加载了自己的模型。

【问题讨论】:

  • 在视图中新建一个DbContext 违背了 MVC 模式。您应该将主视图的模型更改为包含视图的所有项目和任何部分的对象。
  • 您是否有任何具体原因要将产品类别列为部分视图?
  • 因为我希望它出现在这个 webapp 的每个页面上。有没有更好的办法?

标签: c# asp.net asp.net-mvc razor


【解决方案1】:

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

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

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

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

如果您想对每个页面都执行此操作,您应该创建一个新操作,并让该操作呈现,而不是部分视图。 (该动作应称为局部视图)。该操作可以获取所需的信息并将其传递给视图。

@Html.Action("CategoriesHeader")

【讨论】:

  • 我认为他的问题是部分在布局页面中。要使用您的技术,他必须在每个页面的每个模型上都有类别(可能从基类继承)。除非我读错了。
  • 是的。关键是我想在每个页面上显示这个类别列表,这就是我把它放在 _Layout.cshtml 中的原因。所有这些页面都已经有了自己的模型......所以我不知道该怎么做。
  • 从基类派生并设置在那里。
  • 你是什么意思?
  • 据我所知,您可以为此操作渲染部分内容。
【解决方案2】:

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

【讨论】:

  • 我试过用这个方法。在 _Layout.cshtml 我有@Html.Action("CategoriesHeader", "CategoriesController")。在 CategoriesController.cs 我有方法 CategoriesHeader(用 ChildActionOnly 注释),它返回一个 PartialView(带有 _CategoriesHeader.cshtml 和模型)。但现在我得到The controller for path '/' was not found or does not implement IController.。我不知道为什么并尝试了一些不起作用的解决方案。
  • 嗯。我使用“CategoriesController”作为@Html.Action() 的控制器名称,它应该是“Categories”(因为编译器知道它是一个控制器)。以上就是上述错误的解决方法。
  • 出于好奇,我又在搞乱 PartialViews(构建一个购物车,在添加产品时应该重新加载,这不适用于 ChildActionOnly)。但是现在我删除了 ChildActionOnly 并且该站点仍然有效。 ChildActionOnly 只是为了防止将其作为完整页面加载还是还有其他作用?
【解决方案3】:

使用子动作。

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

【讨论】:

  • 这实际上是我现在所做的,但由于它与@LeonardoNeninger 给我的解决方案相同,所以我在那里评论了新的错误消息。
【解决方案4】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-09
    • 1970-01-01
    • 2013-09-20
    • 1970-01-01
    • 2021-07-16
    • 1970-01-01
    • 2010-12-06
    相关资源
    最近更新 更多