Страница макета MVC3, View, RenderPartial и получение файлов скриптов в заголовок (из частичного представления) - PullRequest
13 голосов
/ 12 мая 2011

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

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

Ответы [ 5 ]

8 голосов
/ 12 мая 2011

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

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

6 голосов
/ 17 мая 2011

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

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

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

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

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

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

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

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

1 голос
/ 19 августа 2011

Вот еще один подход с использованием вспомогательных методов и шаблонного делегата http://blogs.msdn.com/b/marcinon/archive/2010/12/15/razor-nested-layouts-and-redefined-sections.aspx

1 голос
/ 24 мая 2011

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

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

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

UPDATE: Существует также сообщение в блоге о работе с RenderSection, которое может оказаться полезным.

0 голосов
/ 28 октября 2011

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

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

...