【问题标题】:Returning string to _Layout.cshtml using PartialView使用 PartialView 将字符串返回到 _Layout.cshtml
【发布时间】:2016-04-11 21:02:19
【问题描述】:

我正在尝试将字符串列表返回到出现在我的 _Layout.cshtml 页面一侧的导航菜单。我可以很好地返回一个字符串,但我应该返回一个 PartialViewResult。这是我得到的错误:

{"未找到局部视图“菜单”或没有视图引擎支持搜索的位置。搜索了以下位置:\r\n~/Views/Nav/Menu.aspx\r\n~/Views/ Nav/Menu.ascx\r\n~/Views/Shared/Menu.aspx\r\n~/Views/Shared/Menu.ascx\r\n~/Views/Nav/Menu.cshtml\r\n~/ Views/Nav/Menu.vbhtml\r\n~/Views/Shared/Menu.cshtml\r\n~/Views/Shared/Menu.vbhtml"}

我的控制器代码:

using SportsStore.Domain.Abstract;
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;

namespace SportsStore.WebUI.Controllers
{
    public class NavController : Controller
    {
        private IProductRepository repository;

        public NavController(IProductRepository repo)
        {
            repository = repo;
        }

        public PartialViewResult Menu()
        {
            IEnumerable<string> categories = repository.Products
                                        .Select(x => x.Category)
                                        .Distinct()
                                        .OrderBy(x => x);

            return PartialView(categories);
        }
    }
}

我的 _Layout.cshtml 文件:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="~/Content/bootstrap.css" rel="stylesheet" />
    <link href="~/Content/bootstrap-theme.css" rel="stylesheet" />
    <title>@ViewBag.Title</title>
</head>
<body>
    <div class="navbar navbar-inverse" role="navigation">
        <a class="navbar-brand" href="#">SPORTS STORE</a>
    </div>
    <div class="row panel">
        <div id="categories" class="col-xs-3">
            @Html.Action("Menu", "Nav")
        </div>
        <div class="col-xs-8">
            @RenderBody()
        </div>
    </div>
</body>
</html>

【问题讨论】:

    标签: asp.net-mvc razor


    【解决方案1】:

    您的菜单视图位于何处?

    如果您没有明确定义 View 的名称,MVC 将采取主动并假定它与您的 Action 命名相同,因此在这种情况下,您需要在以下之一中拥有一个 Menu.cshtml 文件地点:

    • ~/Views/Nav/Menu.cshml
    • ~/Views/Shared/Menu.cshtml

    或者,如果它被命名为 Menu.cshtml 以外的任何名称,您可能需要考虑在代码中指定:

    // This assumes your partial view is named "_Menu.cshtml"
    return PartialView("_Menu",categories);
    

    【讨论】:

    • 没有菜单视图。我希望将 HTML 字符串传递回我的 _Layout.cshtml 中,以便它显示在屏幕左侧的导航菜单中。我正在阅读 Pro ASP.NET MVC 5 书籍。
    • 如果您在您的视图中使用Html.Action() 调用,那么您所指向的操作将有望向您的视图呈现一些内容。我希望由于您正在传递一组对象,您的视图可能应该包含一个循环遍历您的类别并为每个类别输出一个项目。无论如何,您都需要创建一个与此类似的视图,并确保它位于正确的位置以查看它在预期位置呈现。您甚至可以更改您的操作以返回 Content("Example"); 以查看此示例。
    • View 中的 Html.Action() 指向 Controller 中的 Action 方法。当该动作方法返回一个字符串时,它可以很好地显示它。它似乎知道如何找到_Layout.cshtml。但是当那个 Action Method 返回一个 PartialViewResult 时,MVC 想要找到一个不同的 View 文件(一个与方法同名的文件)而不是 _Layout.cshtml。
    • 布局将被使用,因为您返回的是一个局部视图(MVC 会知道这一点,并且只会输出它需要替换您的 Html.Action() 调用)。如果您在我提到的某个位置创建一个类似于this 的视图并放置一个循环来遍历您的项目,您应该会看到它有效。
    • 你是对的。我正在关注的这本书有一个小错误。在下一章中,它让我创建了一个 Menu.cshtml 文件,然后一切正常。
    【解决方案2】:

    @Rion Willimas,你是对的。我正在关注的这本书有一个小错误。在下一章中,它让我创建了一个 Menu.cshtml 文件,然后一切正常。 Menu.cshtml 如下:

    @model IEnumerable<string>
    
    @Html.ActionLink("Home", "List", "Product", null,
        new { @class = "btn btn-block btn-default btn-lg"})
    
    @foreach (var link in Model)
    {
        @Html.RouteLink(link, new
    {
        controller = "Product",
        action = "List",
        category = link,
        page = 1
    }, new
    {
        @class = "btn btn-block btn-default btn-lg"
    })
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-19
      • 1970-01-01
      • 2020-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多