2011-12-20 9 views
32

Mi problema es que parece que no puedo usar @RenderSection desde una plantilla anidada cuando @RenderSection está definido en la plantilla base. Actualmente, tengo una plantilla base anidada que está vinculada a una plantilla secundaria que luego se usa en las páginas de vista. Cuando defino el @RenderSection en la plantilla base y lo renderizo en las páginas de vista arroja un error.@RenderSection en plantillas de maquinilla de afeitar anidadas

Aquí está el problema exacto.

Quiero crear una RenderSection que me permita insertar scripts personalizados. Mi plantilla base ....

<!DOCTYPE html> 
<html> 
<head> 
<title>@ViewBag.Title</title> 
@RenderSection("HeaderContent", false) // The region of the header scripts (custom css) 

</head> 
<body> 
@RenderBody() 
</body> 
</html> 

I Luego, omita la plantilla hija, ya que no quiero poner ningún código de encargo head allí y aplicarlo a la página en sí ..

@section HeaderContent { 
    <script>alert("hi");</script> 
} 

Mi problema es que parece que no puedo agregar un código de cabeza personalizado en la plantilla base de mis páginas normales.

Las siguientes secciones se han definido pero no se han procesado para la página de diseño ~/Views/Shared/OneColLayer.cshtml": "HeaderContent.

¿Debo incluir un puntero a la plantilla base en la página de visualización?

@{ 
    Layout = "~/Views/Shared/BaseTemplate.cshtml"; 
} 

Mi nueva plantilla base

<head> 
    <link rel="stylesheet" type="text/css" href="@Url.Content("~/content/layout.css")" /> 
    <link rel="stylesheet" type="text/css" href="@Url.Content("~/content/global.css")" /> 
    <script type="text/javascript" src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")"></script> 
    <script type="text/javascript" src="@Url.Content("~/js/fadeInFadeOut.js")"></script> 
    <title>@ViewBag.Title</title> 
    @RenderSection("HeaderContent", false) 
</head> 
<body> 
    @RenderBody() 
</body> 

mi nueva plantilla hija

@{ 
    Layout = "~/Views/Shared/BaseTemplate.cshtml"; 
} 
@RenderSection("HeaderContent", false) 
@RenderBody() 

mi punto de vista

@{ 
    ViewBag.Title = "Home"; 
    Layout = "~/Views/Shared/OneColLayer.cshtml"; 
} 
@section HeaderContent { 
    <h1>Left Content</h1> 
} 
<div>my view content</div> 

el contenido se coloca en la plantilla oneCol ahora la plantilla base .

resultados ...

<div id="Content"> 
    <h1>Left Content</h1> 
</div> 

Respuesta

50

Es preciso especificar las secciones que se les permite pasar a través de la plantilla media.

BaseTemplate.cshtml

<!DOCTYPE html> 
<html> 
    <head> 
    <title>@ViewBag.Title</title> 
    @RenderSection("HeaderContent", false) @* The region of the header scripts (custom css) *@ 
    </head> 
<body> 
    @RenderBody() 
</body> 
</html> 

EDIT

su nueva plantilla hija

@{ 
    Layout = "~/Views/Shared/BaseTemplate.cshtml"; 
} 
@section HeaderContent { 
    @RenderSection("HeaderContent", false) 
} 
@RenderBody() 

Si ponemos la sección de rendir dentro de una sección de la plantilla base, representará esa sección en el lugar correcto en el plantilla base


View.cshtml -> utiliza MiddleLayout.cshtml ya que es la disposición

@section HeaderContent 
{ 
    <!-- header content that will now render --> 
} 

<!-- page content --> 
+0

He intentado hacer este método. Pero el contenido en mi vista se muestra en la plantilla que hereda, no en la plantilla base. –

+0

@JamesAndrewSmith por sus ediciones, aparece en su plantilla del medio porque no está poniendo '@ RenderSection' en la plantilla del medio dentro de su sección procesada. Editaré el mío para mostrarte exactamente cómo debería ser el tuyo. –

+0

Funcionó bien para mí – Jacques

Cuestiones relacionadas