Mi principal motivación para intentar hacer esto es obtener Javascript que solo es requerido por un parcial en la parte inferior de la página con el resto del Javascript y no en el medio de la página donde se representa el parcial.
Aquí hay un ejemplo simplificado de lo que estoy tratando de hacer:
Aquí está el diseño con una sección de Scripts justo antes del cuerpo.
<!DOCTYPE html>
<html>
<head>
<title>@ViewBag.Title</title>
<link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" />
</head>
<body>
@RenderBody()
<script src="@Url.Content("~/Scripts/jquery-1.4.4.min.js")" type="text/javascript"></script>
@RenderSection("Scripts", false)
</body>
</html>
Aquí hay una vista de ejemplo con este diseño.
<h2>This is the view</h2>
@{Html.RenderPartial("_Partial");}
@section Scripts {
<script type="text/javascript">
alert("I'm a view.");
</script>
}
Y aquí está el renderizado parcial de la vista.
<p>This is the partial.</p>
@* this never makes it into the rendered page *@
@section Scripts {
<script type="text/javascript">
alert("I'm a partial.");
</script>
}
En este ejemplo, el marcado especificado en la vista se coloca en la sección, pero el marcado del parcial no. ¿Es posible rellenar una sección desde una vista parcial con Razor? Si no es así, ¿cuáles son algunos otros métodos para obtener JavaScript que solo necesitan los parciales en la parte inferior de la página sin incluirlo globalmente?
fuente
Respuestas:
La forma en que manejé esto es escribir un par de métodos de extensión para la clase HtmlHelper. Eso permite que las vistas parciales digan que requieren un script, y luego en la vista de diseño que escribe la etiqueta, llamo a mi método auxiliar para emitir los scripts requeridos.
Estos son los métodos de ayuda:
Una vez que tenga eso en su lugar, su vista parcial solo necesita llamar
@Html.RequireScript("/Path/To/Script")
.Y en la sección de cabecera de la vista de diseño se llama
@Html.EmitRequiredScripts()
.Una ventaja adicional de esto es que le permite eliminar las solicitudes de script duplicadas. Si tiene múltiples vistas / vistas parciales que necesitan un script determinado, puede asumir con seguridad que solo lo generará una vez
fuente
Las vistas parciales no pueden participar en las secciones de sus vistas principales.
fuente
Podrías tener un segundo parcial que solo se encargue de inyectar el javascript necesario. Coloque varios guiones alrededor de los
@if
bloques, si lo desea:Obviamente, esto podría limpiarse un poco, pero luego, en la
Scripts
sección de su vista:Una vez más, puede que no gane un premio de belleza, pero funcionará.
fuente
La forma más elegante de hacer esto es mover scripts de vista parcial a un archivo separado y luego renderizarlo en la sección de vista Scripts:
La vista parcial _ Partial.cshtml :
La vista parcial _ PartialScripts.cshtml solo con scripts:
fuente
Instale el paquete nuget Forloop.HtmlHelpers: agrega algunos ayudantes para administrar scripts en vistas parciales y plantillas de editor.
En algún lugar de su diseño, debe llamar
Aquí será donde se generarán los archivos de secuencia de comandos y los bloques de secuencia de comandos en la página, por lo que recomendaría colocarlo después de sus secuencias de comandos principales en el diseño y después de una sección de secuencias de comandos (si tiene una).
Si está utilizando el marco de optimización web con agrupación, puede utilizar la sobrecarga
de modo que este método se utiliza para escribir archivos de script.
Ahora, en cualquier momento que desee agregar archivos de secuencia de comandos o bloques en una vista, vista parcial o plantilla, simplemente use
Los ayudantes aseguran que solo se procese una referencia de archivo de script si se agrega varias veces y también asegura que los archivos de script se procesen en el orden esperado
fuente
[Versión actualizada] Versión actualizada siguiendo la pregunta de @Necrocubus para incluir scripts en línea.
Mis 2 centavos, es una publicación antigua, pero aún relevante, así que aquí hay una actualización mejorada de la solución del Sr. Bell que funciona con ASP.Net Core.
Permite agregar scripts y estilos al diseño principal desde vistas parciales y subvistas importadas, y la posibilidad de agregar opciones a las importaciones de scripts / estilos (como async diferir, etc.):
fuente
<text>
, simplemente agréguelo como una cadena (aún puede prefijar con @ "" para múltiples líneas si lo prefiere), y sin las<script>
etiquetasPuede crear una nueva
Layout
página y envolver el PartialView dentro de una Vista completa que es responsable de representar el contenido y también cualquier sección de la biblioteca.Por ejemplo, digamos que tengo el siguiente código:
HomeController.cs
Cuando se renderiza la vista de página completa, normalmente se renderiza fusionando dos archivos:
About.cshtml
_Layout.cshtml
(o lo que se especifique en _ViewStart o anulado en la página)Ahora , suponga que desea renderizar
About.cshtml
como una vista parcial , tal vez como una ventana modal en respuesta a la llamada AJAX. El objetivo aquí es devolver solo el contenido especificado en la página Acerca de, scripts y todo, sin toda la hinchazón incluida en el_Layout.cshtml
diseño maestro (como un<html>
documento ).Puede intentarlo así, pero no vendrá con ninguno de los bloques de sección:
En su lugar, agregue una página de diseño más simple como esta:
_PartialLayout.cshtml
O para admitir una ventana modal como esta:
_ModalLayout.cshtml
Luego, puede especificar una vista maestra personalizada en este controlador o cualquier otro controlador que desee para representar el contenido y los scripts de una vista simultáneamente
fuente
Para aquellos que buscan la versión aspnet core 2.0:
Agregue a su diseño después de la llamada a la sección de procesamiento de scripts:
Y en tu vista parcial:
fuente
Basado en la respuesta de Mr Bell y Shimmy anterior, agrego una función adicional para el script Bundle.
Muestra en PartialView: - @ Html.RequireBundleStyles ("~ / bundles / fileupload / bootstrap / BasicPlusUI / css"); @ Html.RequireBundleScripts ("~ / bundles / fileupload / bootstrap / BasicPlusUI / js");
Muestra en MasterPage: - @ Html.EmitRequiredBundleStyles ()
fuente
Utilice las
@using(Html.Delayed()){ ...your content... }
extensiones de la respuesta https://stackoverflow.com/a/18790222/1037948 para representar cualquier contenido (scripts o solo HTML) más adelante en la página. El internoQueue
debe garantizar un pedido correcto.fuente
Esta funcionalidad también se implementa en ClientDependency.Core.Mvc.dll. Proporciona los ayudantes html: @ Html.RequiresJs y @ Html.RenderJsHere (). Paquete Nuget: ClientDependency-Mvc
fuente
Aquí viene mi solución a las preguntas más frecuentes "¿cómo inyectar secciones de vistas parciales a vistas principales o vista de diseño principal para asp.net mvc?". Si haces una búsqueda en stackoverflow por palabras clave "sección + parcial", obtendrás una lista bastante grande de preguntas relacionadas y respuestas dadas, pero ninguna de ellas me parece elegante por medio de la gramática del motor razor. Así que solo eché un vistazo al motor Razor para ver si podría haber una solución mejor a esta pregunta.
Afortunadamente, encontré algo que me resulta interesante de cómo el motor Razor hace la compilación del archivo de plantilla de vista (* .cshtml, * .vbhtml). (Lo explicaré más adelante), a continuación se muestra mi código de la solución, que creo que es bastante simple y lo suficientemente elegante en su uso.
uso : Usar el código también es bastante simple, y tiene casi el mismo estilo que el habitual. También admite cualquier nivel de las vistas parciales anidadas. es decir. Tengo una cadena de plantillas de vista: _ViewStart.cshtml-> layout.cshtml-> index.cshtml -> [head.cshtml, foot.cshtml] -> ad.cshtml.
En layout.cshtml, tenemos:
Y en index.cshtml, tenemos:
Y en head.cshtml, tendríamos el código:
es lo mismo en foot.cshtml o ad.cshtml, aún puede definir la sección Head o Foot en ellos, asegúrese de llamar a @ Html.EnsureSection () una vez al final del archivo de vista parcial. Eso es todo lo que necesita hacer para deshacerse del problema sujeto en asp mvc.
Solo comparto mi fragmento de código para que otros puedan usarlo. Si cree que es útil, no dude en calificar mi publicación. :)
fuente