2011-01-30 13 views
27

Tengo un parcial "barra lateral", agregó a la página maestra (Diseño) y dentro de este parcial que estoy usando:RenderSection() dentro parcial con la página principal

@RenderSection("SearchList", required: false) 

En uno de los puntos de vista que utiliza el página maestra que estoy haciendo:

@section SearchList { 
    // bunch of html 
} 

pero me da el error:

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

¿Qué pasa aquí?

Respuesta

21

Lo que está intentando hacer no es actualmente compatible con Razor. Las secciones solo funcionan entre la página de visualización y su página de diseño inmediato.

+0

Cualquier solución? Tengo un Diseño-> Página-> Parcial. Necesito que los scripts/layouts sean referenciados y cargados en la cabecera cuando ese parcial está allí. ¿Alguna forma no estúpida de hacer esto? ¿Cuál es el objetivo de esta restricción de todos modos? – Shimmy

+0

@Shimmy podrías intentar poner algún tipo de estructura de datos en ViewData que especifique a qué cosas se debe hacer referencia en la página Diseño. – marcind

+0

Gracias. Acabo de leer [Cassette] (http://getcassette.net/) ahora, que parece una solución decente. Gracias. – Shimmy

13

Al crear su vista de diseño, es posible que desee colocar algunas piezas por separado en vistas parciales.

También puede encontrar la necesidad de representar secciones que deben colocarse en el marcado de una de estas vistas parciales. Sin embargo, dado que las vistas parciales no son compatibles con la lógica de RenderSection, tendrás que evitar esto.

Puede representar secciones en vistas parciales pasando el resultado RenderSection de su página Diseño como el modelo de la vista parcial. Puede hacer esto colocando esta línea de código en su _Layout.cshtml.

_Layout.cshtml

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

Luego, en _YourPartial.cshtml que puede hacer que la sección pasado a lo largo como el modelo de la llamada Html.RenderPartial en la vista _Layout. Verifica si el modelo es nulo solo en caso de que no se requiera su sección.

_YourPartial.cshtml

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

¿Qué? Interesante, pero deberías explicarlo un poco más ya que es un truco. –

+1

Actualizar según lo solicitado ... ¿es esto más claro ahora? – Bosken85

+0

Sí. Gracias. Todavía un poco hacky, pero creo que el trabajo. votado. –

4

Es posible resolver esto con ayudantes de afeitar. Es un poco elegantemente hacky ™ pero hizo el trabajo por mí.

Así en una vista padre que definen un ayudante:

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

Luego, cuando se renderiza parcial, se pasa esta ayuda a que

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

A continuación, dentro de una visión parcial se llama a esta ayuda semejante entonces

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

Por último, necesita tener este método de extensión para simplificar el pa "que llama" 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; 
} 

Así que el punto es que pasar un delegado de esta ayuda y luego, cuando el punto de vista del niño lo llama, el contenido consiguen prestados donde desee.

El resultado final de una vista del niño se vería así

<div><blink>Attention!</blink></div> 
Cuestiones relacionadas