Порядок загрузки Действия в ASP.NET MVC View - PullRequest
0 голосов
/ 06 февраля 2019

В _Layout.cshtml мы используем PartialView для боковой панели, например:

        @{ 
            var menuSideAction = Url.Action(MVC.Common.MenuSide());
        }
        <div ng-include="'@menuSideAction'">

        </div>

Метод контроллера такой:

    public virtual ActionResult MenuSide()
    {
        return PartialView("~/Views/Shared/_MenuSide.cshtml");
    }

Проблема, которую ястолкновение с этим подходом состоит в том, что это не предсказуемо, когда Действие выполнено.Иногда он загружается первым при открытии страницы, иногда он загружается только после отображения тела (что для некоторых страниц может занять некоторое время).

Если это вообще возможно, я бы хотел, чтобы страница всегда загружала этоСначала PartialView, но я не нашел способа сделать это.

ОБНОВЛЕНИЕ

Выяснил мою проблему, которую я опубликую в качестве ответа, оказывается, что я слишком много думал (или недооценивал, если выwill) it.

Итак, во-первых, причина, по которой мы использовали здесь ng-include, заключается в том, что наш код AngularJS при частичном просмотре не отвечал без него.Код в контроллере не запускался.

Перед редактированием для использования ng-include у нас была вставлена ​​частичная HTML-страница в _Layout.cshtml, например (упрощенно):

<body ng-controller="commonController">
    <div @(ViewBag.AngularController ?? "")>
        <div>
            @Html.Partial("_MenuSide")
        </div>
        <div>
            @RenderBody()
        </div>
    </div>
</body>

ViewBag.AngularController устанавливается в определенных представлениях Razor (например, Address.cshtml установил бы его в «ng-controller = addressController»)

Я ожидал, что будет запущен код в «commonController», так как онустановлен на теге.Однако, естественно, значение ViewBag.AngularController переопределяет любой контроллер, установленный в теле.

Исправлено следующее: явное указание ng-controller снова в div в частичном представлении, после чего работал код AngularJS.

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

оказывается, что я переосмыслил (или недоумял, если хотите) это.

Итак, во-первых, причина, по которой мы использовали здесь ng-include, заключается в том, что наш код AngularJS на частичном представлении не отвечал без него.Код в контроллере не запускался.

Перед редактированием для использования ng-include у нас была вставлена ​​частичная HTML-страница в _Layout.cshtml, например (упрощенно):

<body ng-controller="commonController">
    <div @(ViewBag.AngularController ?? "")>
        <div>
            @Html.Partial("_MenuSide")
        </div>
        <div>
            @RenderBody()
        </div>
    </div>
</body>

ViewBag.AngularController установлен в определенных представлениях Razor (например, Address.cshtml установил бы его в «ng-controller = addressController»)

Я ожидал, что будет запущен код в «commonController», так как онустановлен на теге.Однако, естественно, значение ViewBag.AngularController переопределяет любой контроллер, установленный в теле.

Исправление заключается в том, чтобы явно указать ng-контроллер снова в div в частичном представлении, а затем работал код AngularJS:

<body ng-controller="commonController">
    <div @(ViewBag.AngularController ?? "")>
        <div>
            @Html.Partial("_MenuSide")
        </div>
        <div>
            @RenderBody()
        </div>
    </div>
</body>

И в частичном:

<div ng-controller="commonController">
    <!-- html code goes here -->
</div>
0 голосов
/ 06 февраля 2019

Я считаю, что лучше использовать Html.RenderPartial("_MenuSide.cshtml").Рендеринг происходит последовательно, поэтому убедитесь, что вы поместили RenderPartial перед RenderBody на странице макета.

<body>
    @{
        Html.RenderPartial("_HeaderNavBar");
    }
    <div class="container body-content">
        @RenderBody()
    </div>
</body>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...