Я использую @RenderSection("scripts", required: false)
в _Layout.cshtml в нижней части страницы после того, как сценарий входит в комплект. My View с использованием этого макета определил раздел скриптов (@section scripts{ //script block}
). Все работает нормально, когда я отображаю представление из действия контроллера через полный вызов страницы.
Но когда я отображаю содержимое того же представления внутри контейнера, используя обработчик вызова $ .ajax, например ($('#container').html(result)
), тогда секция сценариев, определенная на странице _Layout.cshtml , не загружается и не выполняется на DOM. Обратите внимание, что в этом случае _Layout не загружается, поскольку вызов был ajax, и страница макета уже была в DOM, и я не хочу загружать страницу макета снова, чтобы улучшить время загрузки страницы. Меня интересует только загрузка содержимого дочернего представления.
Пожалуйста, найдите ниже настройки
_Layout.cshtml
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
@Styles.Render("~/Content/css")
</head>
<body>
<div class="navbar navbar-inverse navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li>@Html.ActionLink("Load Full", "LoadPartial", "Home")</li>
<li><a href="#" id="lnkMenu" data-url="@Url.Action("LoadPartial","Home")">Load via SPA</a></li>
</ul>
</div>
</div>
</div>
<div id="container" class="container body-content">
@RenderBody()
<hr />
</div>
@Scripts.Render("~/bundles/jquery")
@Scripts.Render("~/bundles/bootstrap")
<script src="~/Scripts/Common.js"></script>
@RenderSection("scripts", required: false)
</body>
</html>
Контроллер
public ViewResult LoadPartial()
{
return View("_LoadPartial");
}
_ViewStart.cshtml:
@{
Layout = Request.IsAjaxRequest() ? null : "~/Views/Shared/_Layout.cshtml";
}
Частичное представление: _LoadPartial.cshtml
<div class="jumbotron">
<h2>Script loading demo</h2>
</div>
<p id="partial-id">Partial view content</p>
@section scripts
{
<script>
$(function () {
console.log("full");
$('#partial-id').css('color', 'blue');
});
</script>
}
Java-скрипт код для загрузки представления с помощью вызова ajax
$(function () {
$('#lnkMenu').click(function () {
var url = $(this).data("url");
$.ajax({
url: url,
type: 'GET',
cache: false
}).done(function (result) {
$('#container').html(result);
});
});
});
Теперь, когда я загружаю страницу, используя Layout в первом случае, она работает нормально. Но если я попытаюсь загрузить страницу, используя jquery ajax, тогда сценарий не работает.
========================= Решение, которое я пробовал ================ ===============
Чтобы исправить это, я попробовал следующее решение, т. Е. На мой взгляд, я загружаю раздел скрипта, исходя из условия, что если запрос Ajax, то запускает скрипт нормально, а если это полностраничный запрос с Layout, то запускаю секцию скрипта. С этим решением мой _LoadPartial.cshtml вид выглядит следующим образом
<div class="jumbotron">
<h2>Script loading demo</h2>
</div>
<p id="partial-id">Partial view content</p>
@{
if (Request.IsAjaxRequest())
{
<script>
$(function () {
console.log("partial");
$('#partial-id').css('color', 'blue');
});
</script>
}
else
{
@section scripts
{
<script>
$(function () {
console.log("full");
$('#partial-id').css('color', 'blue');
});
</script>
}
}
}
Это решение прекрасно работает в обоих случаях, но здесь проблема с решением заключается в том, что он нарушает принцип DRY , так как мне приходится писать один и тот же блок скриптов как в if
, так и в остальном block
.
Кто-нибудь знает, как лучше всего справляться с такими сценариями?