vistas partialview parciales mvc example asp.net-mvc-3 c#-4.0 razor

asp.net-mvc-3 - partialview - render partial view mvc 5 example



¿Cómo representar JavaScript en la sección MasterLayout desde una vista parcial? (3)

Esto me funcionó permitiéndome ubicar conjuntamente javascript y html para una vista parcial en el mismo archivo para facilitar la lectura

En la vista que utiliza la vista parcial llamada "_MyPartialView.cshtml"

<div> @Html.Partial("_MyPartialView",< model for partial view>, new ViewDataDictionary { { "Region", "HTMLSection" } } }) </div> @section scripts{ @Html.Partial("_MyPartialView",<model for partial view>, new ViewDataDictionary { { "Region", "ScriptSection" } }) }

En el archivo de vista parcial

@model SomeType @{ var region = ViewData["Region"] as string; } @if (region == "HTMLSection") { } @if (region == "ScriptSection") { <script type="text/javascript"> </script"> }

Dado el motor MVC3 y Razor, tengo

_MasterLayout.cshtml

@RenderSection("JavaScript", required: false) .. .. @RenderBody() ..

View.cshtml con _MasterLayout.cshtml definido en _ViewStart.cshtml

.. @Html.RenderAction("PartialView", "PartialController") ..

PartialView.cshtml

.. @section JavaScript { ........ } ..

¿Cómo puedo asegurarme de que JavaScript de la Vista parcial termina en la sección Diseño maestro?

Editar

El escenario anterior no funciona porque la vista parcial no tiene un diseño maestro definido. La vista, por otro lado, tiene la disposición con RenderSection definido. Si muevo la sección JavaScript de la Vista parcial a la Vista, Razor sabe dónde renderizarla. Pero, dado que la vista parcial no tiene un diseño, no sabe qué hacer con la sección JavaScript y, por lo tanto, no la muestra en ningún lugar.


Creé un conjunto de métodos de extensión para representar bloques de scripts (o cualquier cosa) desde un parcial, al diseño principal.

public static class ViewPageExtensions { private const string SCRIPTBLOCK_BUILDER = "ScriptBlockBuilder"; public static MvcHtmlString ScriptBlock( this WebViewPage webPage, Func<dynamic, HelperResult> template) { if (!webPage.IsAjax) { var scriptBuilder = webPage.Context.Items[SCRIPTBLOCK_BUILDER] as StringBuilder ?? new StringBuilder(); scriptBuilder.Append(template(null).ToHtmlString()); webPage.Context.Items[SCRIPTBLOCK_BUILDER] = scriptBuilder; return new MvcHtmlString(string.Empty); } return new MvcHtmlString(template(null).ToHtmlString()); } public static MvcHtmlString WriteScriptBlocks(this WebViewPage webPage) { var scriptBuilder = webPage.Context.Items[SCRIPTBLOCK_BUILDER] as StringBuilder ?? new StringBuilder(); return new MvcHtmlString(scriptBuilder.ToString()); } }

Entonces se puede usar como tal:

@this.ScriptBlock( @<script type=''text/javascript''> $(document).ready(function () { notify(''@message'', ''@Model.Type.ToString()'', ''@Model.Type.ToString().ToLower()''); }); </script>)

Y luego se representa en el diseño principal:

@this.WriteScriptBlocks()

Echa un vistazo al artículo completo aquí: Un delegado con plantilla de bloques para secuencias de comandos en línea en parciales de Razor


No creo que una Vista parcial pueda configurar las secciones que se utilizarán en la página de diseño :(

Parece que no hay soluciones agradables para esto, podría incluir dos parciales (uno para script, uno para contenido):

<script stuff> @Html.RenderAction("PartialViewScripts", "PartialController") </script stuff> <body stuff> @Html.RenderAction("PartialView", "PartialController") </body stuff>