2011-01-30 4 views
27

У меня есть частичный «Sidebar» добавлен к главной странице (Layout) и внутри этого частичного Я использую:RenderSection() внутри частичного с главной страницей

@RenderSection("SearchList", required: false) 

На одном из представлений, который использует главная страница я делаю:

@section SearchList { 
    // bunch of html 
} 

, но это дает мне ошибку:

The file "~/Views/Shared/_SideBar.cshtml" cannot be requested directly because it calls the "IsSectionDefined" method.

Что случилось здесь?

ответ

21

То, что вы пытаетесь сделать, в настоящее время не поддерживается в Razor. Разделы работают только между страницей просмотра и ее непосредственной страницей макета.

+0

Любой обходной? У меня есть Layout-> Page-> Partial. Мне нужны сценарии/макеты, на которые нужно ссылаться и загружаться в голову, когда это частичное есть. Любой не-глупый способ сделать это? В чем смысл этого ограничения? – Shimmy

+0

@Shimmy вы могли бы попробовать поставить какую-то структуру данных в ViewData, которая указывает, на какие вещи следует ссылаться на странице Layout. – marcind

+0

Спасибо. Сейчас я просто читаю о [Cassette] (http://getcassette.net/), которая выглядит как достойное решение. Спасибо. – Shimmy

13

При создании вида макета вы можете поместить отдельные части на частичные виды.

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

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

_Layout.cshtml

@{ Html.RenderPartial("_YourPartial", RenderSection("ContextMenu", false));} 

Тогда в _YourPartial.cshtml вы можете сделать раздел передается вместе, как модели в вызове Html.RenderPartial по мнению _layout. Вы проверяете, является ли модель пустой, если ваш раздел не требуется.

_YourPartial.cshtml

@model HelperResult 
@if (Model != null) 
{ 
    @Model 
} 
+1

Что? Интересно, но вы должны объяснить это немного дальше, так как это немного взломать. –

+1

Обновление в соответствии с запросом ... это более ясно сейчас? – Bosken85

+0

Да. Благодарю. Все еще немного взломано, но делает работу, я думаю. upvoted. –

4

можно решить эту проблему с бритвенными хелперов. Это своего рода элегантно-хакки, но это помогло мне.

Так в родительском окне вы определить помощник:

@helper HtmlYouWantRenderedInAPartialView() 
{ 
    <blink>Attention!</blink> 
} 

Затем, когда вы предоставляете частичными, вы пройдете этот помощник к нему

@Html.Partial("somePartial", new ViewDataDictionary { { "OptionalSection1", (Func<HelperResult>)(HtmlYouWantRenderedInAPartialView) } }) 

Тогда внутри частичного вида вы называете этот помощник, как так

<div>@ViewData.RenderHelper("OptionalSection1")</div> 

Наконец, вам необходимо иметь этот метод расширения, чтобы упростить «вызов» pa RT

public static HelperResult RenderHelper(this ViewDataDictionary<dynamic> viewDataDictionary, string helperName) 
{ 
    Func<HelperResult> helper = viewDataDictionary[helperName] as Func<HelperResult>; 
    if (helper != null) 
    { 
     return helper(); 
    } 

    return null; 
} 

Так все дело в том, чтобы передать делегат этого помощника, а затем, когда вид ребенка называет его содержимое получить визуализации, где вы хотите их.

Конечным результатом зрения ребенка будет выглядеть следующим образом

<div><blink>Attention!</blink></div> 
Смежные вопросы