MVC3 Layout, View, RenderPartial и получение файлов script в заголовке (с частичного представления)

Итак, у меня есть страница макета

<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, изначально ответив на этот вопрос.

Ответы

Ответ 1

Вы не можете определять разделы в частичных представлениях.

Вместо этого вы можете поместить Javascript в ViewBag, а затем испустить любой Javascript, найденный в ViewBag на странице макета.

Ответ 2

@JasCav: если частичный нужен собственный CSS, у него нет хорошего способа получить его.

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

Вы не хотите иметь отдельный CSS файл x partial/helper. Помните, что каждый отдельный CSS файл означает отдельный запрос, чтобы получить его с сервера, таким образом, дополнительный раунд, который влияет на время, чтобы отобразить вашу страницу.

Также вы не хотите выделять прямой CSS в HTML из частичного/вспомогательного. Вместо этого вы хотите, чтобы у него были подходящие крючки, которые вы можете использовать, чтобы определить весь внешний вид в файле CSS вашего сайта.

Вы можете использовать те же самые крючки, которые у вас есть для CSS, чтобы активировать пользовательские действия JavaScript для задействованных элементов. Когда JavaScript включен.

Наконец, может случиться так, что вам нужен не Partial View, а дополнительный макет, который вы используете для некоторых страниц. При таком подходе у вас будет:

  • Мастер-макет, который автоматически устанавливается на _ViewStart, как вы, вероятно, сейчас. Это определяет разделы, как в вашем примере.
  • Страница макета для детей. Здесь у вас есть и дополнительные html, css, js, которые вам нужны для этих просмотров. Это использует как @RenderBody(), так и @section SomeSection {} для структурирования вашего общего дополнительного макета.
  • Некоторые представления, указывающие на макет детей, и другие, которые используют стандартный макет по умолчанию.

Как получить дополнительные данные для детей Макет выходит за рамки вопроса, но у вас есть несколько вариантов. Как иметь общую базу для ваших сущностей; используя ViewBag или вызывая Html.RenderAction, чтобы получить эту общую логику, связанную с общими динамическими элементами в макете.

Ответ 3

Похоже, был вопрос, похожий на SO - Как отредактировать JavaScript в разделе MasterLayout с частичного просмотра?.

К сожалению, нет возможности объявлять разделы внутри Partial Views. Это связано с тем, что RenderPartial заканчивает рендеринг полностью отдельной страницы просмотра. Существует обходное решение, хотя и немного уродливое. Но при использовании сильно типизированной модели вместо ViewData она может выглядеть лучше.

В принципе, вам нужно отслеживать ссылку на представление, которое называется RenderPartial, и использовать метод DefineSection для объекта, переданного для передачи данных в это представление.

ОБНОВЛЕНИЕ: Существует также сообщение о работе с RenderSection, которое может вам пригодиться.

Ответ 5

В качестве продолжения моего вопроса инструмент JavaScript/CSS combiner/ minifier Cassette поддерживает эту функцию, чтобы вы могли разделяйте ваши JavaScript и другие активы, необходимые для частичных действий.

Я приобрел лицензию на сайт и теперь использую ее во всех своих приложениях MVC.