Ответ 1
Вы не можете определять разделы в частичных представлениях.
Вместо этого вы можете поместить Javascript в ViewBag
, а затем испустить любой Javascript, найденный в ViewBag
на странице макета.
Итак, у меня есть страница макета
<head>
@RenderSection("HeaderLast", required: false)
</head>
Вид
@section HeaderLast
{
<script src="@Url.Content("~/Scripts/knockout-1.2.0.js")"
type="text/javascript"></script>
}
<div id="profile-tab">
@{ Html.RenderPartial("_userProfile"); }
</div>
И частичный вид
@section HeaderLast
{
<script type="text/javascript">
alert('test');
</script>
}
<div......
Я понял, что это не может быть так просто. Есть ли правильный способ сделать это из коробки или это всегда потребует какого-то посредника и передачи материала вокруг ViewData, чтобы вручную сделать содержимое пузырьком на странице макета?
Началась Баунти: Награда будет вознаграждена за лучшее решение, предусмотренное для этого короткого прихода. Если ответы не будут предоставлены, я вручу его @SLaks, изначально ответив на этот вопрос.
Вы не можете определять разделы в частичных представлениях.
Вместо этого вы можете поместить Javascript в ViewBag
, а затем испустить любой Javascript, найденный в ViewBag
на странице макета.
@JasCav: если частичный нужен собственный CSS, у него нет хорошего способа получить его.
Если это причина его использования, это может быть очень хорошо по дизайну.
Вы не хотите иметь отдельный CSS файл x partial/helper. Помните, что каждый отдельный CSS файл означает отдельный запрос, чтобы получить его с сервера, таким образом, дополнительный раунд, который влияет на время, чтобы отобразить вашу страницу.
Также вы не хотите выделять прямой CSS в HTML из частичного/вспомогательного. Вместо этого вы хотите, чтобы у него были подходящие крючки, которые вы можете использовать, чтобы определить весь внешний вид в файле CSS вашего сайта.
Вы можете использовать те же самые крючки, которые у вас есть для CSS, чтобы активировать пользовательские действия JavaScript для задействованных элементов. Когда JavaScript включен.
Наконец, может случиться так, что вам нужен не Partial View, а дополнительный макет, который вы используете для некоторых страниц. При таком подходе у вас будет:
Как получить дополнительные данные для детей Макет выходит за рамки вопроса, но у вас есть несколько вариантов. Как иметь общую базу для ваших сущностей; используя ViewBag или вызывая Html.RenderAction, чтобы получить эту общую логику, связанную с общими динамическими элементами в макете.
Похоже, был вопрос, похожий на SO - Как отредактировать JavaScript в разделе MasterLayout с частичного просмотра?.
К сожалению, нет возможности объявлять разделы внутри Partial Views. Это связано с тем, что RenderPartial заканчивает рендеринг полностью отдельной страницы просмотра. Существует обходное решение, хотя и немного уродливое. Но при использовании сильно типизированной модели вместо ViewData она может выглядеть лучше.
В принципе, вам нужно отслеживать ссылку на представление, которое называется RenderPartial, и использовать метод DefineSection для объекта, переданного для передачи данных в это представление.
ОБНОВЛЕНИЕ: Существует также сообщение о работе с RenderSection, которое может вам пригодиться.
Вот еще один подход, использующий вспомогательные методы и шаблонный делегат http://blogs.msdn.com/b/marcinon/archive/2010/12/15/razor-nested-layouts-and-redefined-sections.aspx
В качестве продолжения моего вопроса инструмент JavaScript/CSS combiner/ minifier Cassette поддерживает эту функцию, чтобы вы могли разделяйте ваши JavaScript и другие активы, необходимые для частичных действий.
Я приобрел лицензию на сайт и теперь использую ее во всех своих приложениях MVC.