Моя основная мотивация для попытки сделать это - получить Javascript, который требуется только для части в нижней части страницы с остальной частью Javascript, а не в середине страницы, где отображается часть.
Вот упрощенный пример того, что я пытаюсь сделать:
Вот макет с разделом скриптов прямо перед телом.
<!DOCTYPE html>
<html>
<head>
<title>@ViewBag.Title</title>
<link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" />
</head>
<body>
@RenderBody()
<script src="@Url.Content("~/Scripts/jquery-1.4.4.min.js")" type="text/javascript"></script>
@RenderSection("Scripts", false)
</body>
</html>
Вот пример просмотра с использованием этого макета.
<h2>This is the view</h2>
@{Html.RenderPartial("_Partial");}
@section Scripts {
<script type="text/javascript">
alert("I'm a view.");
</script>
}
А вот частичный рендеринг из вида.
<p>This is the partial.</p>
@* this never makes it into the rendered page *@
@section Scripts {
<script type="text/javascript">
alert("I'm a partial.");
</script>
}
В этом примере разметка, указанная в представлении, помещается в раздел, а разметка из партиала - нет. Можно ли с помощью Razor заполнить раздел из частичного представления? Если нет, то каковы другие методы получения Javascript, который нужен только частичным элементам внизу страницы, без его глобального включения?
javascript
asp.net-mvc-3
razor
Крейг М
источник
источник
Ответы:
Я решил эту проблему, написав пару методов расширения для класса HtmlHelper. Это позволяет частичным представлениям сказать, что им требуется сценарий, а затем в представлении макета, который записывает тег, который я вызываю в свой вспомогательный метод, чтобы испустить необходимые сценарии.
Вот вспомогательные методы:
Как только вы это сделаете, вам просто нужно вызвать частичное представление
@Html.RequireScript("/Path/To/Script")
.И в разделе заголовка макета вы вызываете
@Html.EmitRequiredScripts()
.Дополнительным преимуществом этого является то, что он позволяет отсеивать повторяющиеся запросы скриптов. Если у вас есть несколько представлений / частичных представлений, которым нужен данный сценарий, вы можете с уверенностью предположить, что вы выведете его только один раз
источник
Частичные представления не могут участвовать в разделах своих родительских представлений.
источник
У вас может быть вторая часть, которая отвечает только за внедрение необходимого javascript. Разместите несколько скриптов вокруг
@if
блоков, если хотите:Очевидно, это можно было бы немного очистить, но тогда в
Scripts
разделе вашего представления:Опять же, он может и не получить приз за красоту, но он сработает.
источник
Более элегантный способ сделать это - переместить сценарии частичного представления в отдельный файл и затем отобразить его в разделе представления сценариев:
Частичное представление _ Partial.cshtml :
Частичное представление _ PartialScripts.cshtml только со скриптами:
источник
Установите пакет Nuget Forloop.HtmlHelpers - он добавляет несколько помощников для управления скриптами в частичных представлениях и шаблонах редактора.
Где-то в вашем макете нужно позвонить
Здесь будут выводиться любые файлы сценариев и блоки сценариев на странице, поэтому я бы рекомендовал поместить их после основных сценариев в макете и после раздела сценариев (если он у вас есть).
Если вы используете The Web Optimization Framework с объединением, вы можете использовать перегрузку
так что этот метод используется для записи файлов сценария.
Теперь, когда вы хотите добавить файлы сценариев или блоки в представление, частичное представление или шаблон, просто используйте
Помощники обеспечивают отображение только одной ссылки на файл сценария, если добавляются несколько раз, а также обеспечивают отображение файлов сценария в ожидаемом порядке, т.е.
источник
[Обновленная версия] Обновленная версия после вопроса @Necrocubus для включения встроенных скриптов.
Мои 2 цента, это старый пост, но все еще актуальный, поэтому вот обновленное обновление решения г-на Белла, которое работает с ASP.Net Core.
Он позволяет добавлять сценарии и стили к основному макету из импортированных частичных представлений и подпредставлений, а также возможность добавлять параметры для импорта сценариев / стилей (например, async defer и т. Д.):
источник
<text>
, просто добавьте его в виде строки (вы все равно можете использовать префикс @ "" для многострочных строк, если хотите), и без<script>
теговВы можете создать новую
Layout
страницу и обернуть PartialView внутри полного представления, которое отвечает за отображение содержимого, а также любых разделов библиотеки.Например, допустим, у меня есть следующий код:
HomeController.cs
Когда отображается полная страница, она обычно отображается путем слияния двух файлов:
About.cshtml
_Layout.cshtml
(или все, что указано в _ViewStart или переопределено на странице)Теперь предположим, что вы хотите отрисовать
About.cshtml
как частичное представление , возможно, как модальное окно в ответ на вызов AJAX. Цель здесь - вернуть только содержимое, указанное на странице «О нас», сценариях и всем остальном, без излишков, включенных в_Layout.cshtml
главный макет (например, полный<html>
документ).Вы можете попробовать это так, но в нем не будет ни одного из блоков раздела:
Вместо этого добавьте страницу с более простым макетом, например так:
_PartialLayout.cshtml
Или для поддержки такого модального окна:
_ModalLayout.cshtml
Затем вы можете указать настраиваемое главное представление в этом контроллере или любом другом обработчике, который вы хотите отображать содержимое и скрипты представления одновременно.
источник
Для тех, кто ищет версию aspnet core 2.0:
Добавьте в свой макет после вызова раздела рендеринга скриптов:
И на ваш частичный взгляд:
источник
Основываясь на ответе г-на Белла и Шимми выше, я добавляю дополнительную функцию для сценария Bundle.
Пример в PartialView: - @ Html.RequireBundleStyles ("~ / bundles / fileupload / bootstrap / BasicPlusUI / css"); @ Html.RequireBundleScripts ("~ / bundles / fileupload / bootstrap / BasicPlusUI / js");
Пример на MasterPage: - @ Html.EmitRequiredBundleStyles ()
источник
Используйте
@using(Html.Delayed()){ ...your content... }
расширения из ответа https://stackoverflow.com/a/18790222/1037948, чтобы отображать любой контент (скрипты или просто HTML) позже на странице. ВнутреннийQueue
должен обеспечивать правильный заказ.источник
Эта функция также реализована в ClientDependency.Core.Mvc.dll. Он предоставляет html-помощники: @ Html.RequiresJs и @ Html.RenderJsHere (). Пакет Nuget: ClientDependency-Mvc
источник
Здесь я нашел мое решение на часто задаваемые вопросы «как вставить разделы из частичных представлений в основные представления или основные представления макета для asp.net mvc?». Если вы выполните поиск в stackoverflow по ключевым словам «section + partial», вы получите довольно большой список связанных вопросов и ответов, но ни один из них не кажется мне элегантным с помощью грамматики бритвенного движка. Поэтому я просто посмотрю на движок Razor, чтобы узнать, есть ли лучшее решение этого вопроса.
К счастью, я обнаружил, что мне интересно, как движок Razor выполняет компиляцию файла шаблона представления (* .cshtml, * .vbhtml). (Я объясню позже), ниже мой код решения, который, на мой взгляд, довольно прост и достаточно элегантен в использовании.
Использование : Использовать код также довольно просто, и он выглядит почти так же, как и обычный. Он также поддерживает любые уровни вложенных частичных представлений. т.е. У меня есть цепочка шаблонов представления: _ViewStart.cshtml-> layout.cshtml-> index.cshtml -> [head.cshtml, foot.cshtml] -> ad.cshtml.
В layout.cshtml у нас есть:
И в index.cshtml у нас есть:
А в head.cshtml у нас будет код:
это то же самое в foot.cshtml или ad.cshtml, вы все равно можете определить в них раздел Head или Foot, обязательно вызовите @ Html.EnsureSection () один раз в конце файла частичного представления. Это все, что вам нужно сделать, чтобы избавиться от данной проблемы в asp mvc.
Я просто делюсь своим фрагментом кода, чтобы другие могли его использовать. Если вы считаете, что это полезно, пожалуйста, не стесняйтесь оценивать мой пост. :)
источник