【问题标题】:Calling partial view from _Layout.cshtml从 _Layout.cshtml 调用局部视图
【发布时间】:2018-01-03 06:22:21
【问题描述】:

我有一个主要类别,主要类别在数据库中有其子类别列表。所以它是一个关系数据库。为了更好地理解 .edmx 地图图片已附上。现在我的目标是一个名为 _GuestNav.cshtml 的局部视图将包含类别和子类别列表显示,然后将从 _Layout.cshtml 调用这个 _GuestNav.cshtml。所以我从 _Layout.cshtml 调用部分视图,该部分视图包含带有 foreach 循环的动态数据。所以我想知道如何正确循环以在 _GuestNav.cshtml 上显示主类别和子类别?我已尽力让您更好地理解,但如果您有任何问题,请向我提问。

控制器:

[ChildActionOnly]
        public PartialViewResult _GuestNav()
        {
            using (var db = new MyAppWebEntities())
            {
                return PartialView("_GuestNav", db.Categories.ToList());
            }
        }

_Layout.cshtml:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>@ViewBag.Title</title>
    @Styles.Render("~/Content/css")
    @Scripts.Render("~/bundles/modernizr")

    @Scripts.Render("~/bundles/jquery")
    @Scripts.Render("~/bundles/bootstrap")

    <link href="~/Content/font-awesome.min.css" rel="stylesheet" />
    <script src="~/Content/sweetalert.min.js"></script>
    <script src='https://www.google.com/recaptcha/api.js'></script>
    @RenderSection("scripts", required: false)

</head>
<body>
    <nav class="navbar navbar-default navbar-fixed-top">
        <div class="container">
            <div class="container-fluid">
                <div class="navbar-header">
                    <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
                        <span class="sr-only">Toggle navigation</span>
                        <span class="icon-bar"></span>
                        <span class="icon-bar"></span>
                        <span class="icon-bar"></span>
                    </button>
                    <a class="navbar-brand" href="@Url.Action("Index", "Home")">My App <i class="fa fa-refresh" aria-hidden="true"></i></a>
                </div>

                <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
                    @Html.Partial("_GuestNav"); @* here i am calling partial view *@  
                </div>
            </div>
        </div>
    </nav>
    <div class="container body-content">
        @RenderBody()
        <hr />
        @Html.Partial("_Footer")
    </div>

</body>
</html>

_GuestNav.cshtml:

<ul class="nav navbar-nav">
    <li>@Html.ActionLink("Plans", "Plans", "Home")</li>

    @* Example of loop bellow *@
    @*@foreach (var allcat in allcats)
    {
        <li class="dropdown">
            <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">@allcat.MainCatName<span class="caret"></span></a>
            <ul class="dropdown-menu" role="menu">
                @foreach (var subcat in allcat.subcat)
                {
                    <li><a href="#">subcat.SubcatName</a></li>
                }
            </ul>
        </li>
    }*@

    @* Wanted output like bellow from database---> *@
    <li class="dropdown">
        <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">Main Cat 1<span class="caret"></span></a>
        <ul class="dropdown-menu" role="menu">
            <li><a href="#">Subcat</a></li>
            <li><a href="#">Subcat</a></li>
            <li><a href="#">Subcat</a></li>
            <li><a href="#">Subcat</a></li>
        </ul>
    </li>
    <li class="dropdown">
        <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">Main Cat 2<span class="caret"></span></a>
        <ul class="dropdown-menu" role="menu">
            <li><a href="#">Subcat</a></li>
            <li><a href="#">Subcat</a></li>
            <li><a href="#">Subcat</a></li>
            <li><a href="#">Subcat</a></li>
        </ul>
    </li>
</ul>

【问题讨论】:

  • 我没有看到问题?
  • 使用@Html.RenderAction("_GuestNav", "ControllerName") 而不是@Html.Partial
  • 你能不能也举个例子来处理_GuestNav.cshtml?我的意思是循环主类别和子类别的正确方法
  • 所以我想知道如何正确循环以在 _GuestNav.cshtml 上显示主类别和子类别?
  • db.Categories.ToList() 返回IEnumerable,您可以使用Count 的索引作为限制,如下所示:@for (var i = 0; i &lt; Model.something.Count; i++) { @Model.something[i].SubcatName }

标签: asp.net-mvc


【解决方案1】:

1.更改@Html.Partial("_GuestNav") to @{Html.RenderAction("_GuestNav", "YourControlerName");}

2.在局部视图顶部添加@Model TypeofYourViewModel

3.改变循环如下:

@foreach (var item in Model)
    {
        <li class="dropdown">
            <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">@item.MainCatName<span class="caret"></span></a>
            <ul class="dropdown-menu" role="menu">
                @foreach (var subcat in item.subcat)
                {
                    <li><a href="#">subcat.SubcatName</a></li>
                }
            </ul>
        </li>
    }

注意:将 TypeofYourViewModel 更改为您传递给局部视图的任何 ViewModel

【讨论】:

  • 它的@Html.Action(...)@{Html.RenderAction(...);}
  • 我认为您需要重新查看您的 @Html.RenderAction() 语法。你能澄清一下 RenderAction _GuestNav 这里的第二个参数是什么吗?因为当局部视图中显示的数据独立于对应的视图模型时,RenderAction 方法很有用。
  • ibb.co/bQd2Ew 请检查这张照片。 RenderAction 的问题
  • @Kevinhimch 抱歉。更新了。
猜你喜欢
  • 2011-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-15
  • 2021-03-14
  • 1970-01-01
  • 1970-01-01
  • 2011-08-22
相关资源
最近更新 更多