Tengo esta sección definida en mi _Layout.cshtml
@RenderSection("Scripts", false)
Puedo usarlo fácilmente desde una vista:
@section Scripts {
@*Stuff comes here*@
}
Con lo que estoy luchando es cómo inyectar algo de contenido dentro de esta sección desde una vista parcial.
Asumamos que esta es mi página de vista:
@section Scripts {
<script>
//code comes here
</script>
}
<div>
poo bar poo
</div>
<div>
@Html.Partial("_myPartial")
</div>
Necesito inyectar algo de contenido dentro de la Scripts
sección desde _myPartial
una vista parcial.
¿Cómo puedo hacer esto?
Respuestas:
Las secciones no funcionan en vistas parciales y eso es por diseño. Puede usar algunos ayudantes personalizados para lograr un comportamiento similar, pero honestamente es responsabilidad de la vista incluir los scripts necesarios, no la responsabilidad parcial. Recomendaría usar la sección @scripts de la vista principal para hacer eso y no hacer que los parciales se preocupen por los scripts.
fuente
Esta es una pregunta bastante popular, así que publicaré mi solución.
Tuve el mismo problema y, aunque no es ideal, creo que en realidad funciona bastante bien y no hace que el parcial dependa de la vista.
Mi escenario era que una acción era accesible por sí misma, pero también podía integrarse en una vista: un mapa de Google.
En mi
_layout
tengo:En mi
index
opinión tengo:En mi
clients
opinión, tengo (todo el mapa y la asociación html):Mi
Clients_Scripts
vista contiene el JavaScript que se representará en la páginaDe esta manera, mi secuencia de comandos está aislada y se puede representar en la página donde sea necesario, con la
body_scripts
etiqueta solo representada en la primera vez que el motor de vista de afeitar la encuentra.Eso me permite tener todo separado: es una solución que funciona bastante bien para mí, otros pueden tener problemas con ella, pero soluciona el agujero "por diseño".
fuente
De las soluciones en este hilo , se me ocurrió la siguiente solución probablemente demasiado complicada que le permite retrasar la representación de cualquier html (también scripts) dentro de un bloque de uso.
USO
Crea la "sección"
Escenario típico: en una vista parcial, solo incluya el bloque una vez, sin importar cuántas veces se repita la vista parcial en la página:
En una vista parcial, incluya el bloque por cada vez que se use el parcial:
En una vista parcial, solo incluya el bloque una vez, sin importar cuántas veces se repita el parcial, pero más tarde, hágalo específicamente por su nombre
when-i-call-you
:Renderizar las "secciones"
(es decir, mostrar la sección retrasada en una vista principal)
CÓDIGO
fuente
isOnlyOne
, pero solo si desea representarlo en una ubicación específica por nombre, proporcione el identificador, de lo contrario, se tira a la basuraHtml.RenderDelayed()
.Tuve este problema y usé esta técnica.
Es la mejor solución que encontré, que es muy flexible.
También vote aquí para agregar soporte para la declaración de sección acumulativa
fuente
Si tiene una necesidad legítima de ejecutar algunos
js
de unpartial
, aquí es cómo puede hacerlo,jQuery
se requiere:fuente
Siguiendo el principio discreto , no es necesario que "_myPartial" inyecte contenido directamente en la sección de scripts. Puede agregar esos scripts de vista parcial en un
.js
archivo separado y hacer referencia a ellos en la sección @scripts desde la vista principal.fuente
Hay una falla fundamental en la forma en que pensamos sobre la web, especialmente cuando usamos MVC. La falla es que JavaScript es de alguna manera responsabilidad de la vista. Una vista es una vista, JavaScript (conductual o de otro tipo) es JavaScript. En el patrón MVVM de Silverlight y WPF nos enfrentamos con "ver primero" o "modelo primero". En MVC siempre debemos tratar de razonar desde el punto de vista del modelo y JavaScript es parte de este modelo de muchas maneras.
Sugeriría usar el patrón AMD (a mí mismo me gusta RequireJS ). Separe su JavaScript en módulos, defina su funcionalidad y conéctese a su html desde JavaScript en lugar de confiar en una vista para cargar el JavaScript. Esto limpiará su código, separará sus preocupaciones y facilitará la vida de una sola vez.
fuente
window
objeto e incluyo scripts de biblioteca antes de cualquier parcial.El objetivo del OP es que quiera definir los scripts en línea en su Vista parcial, lo que supongo que este script es específico solo para esa Vista parcial y tiene ese bloque incluido en su sección de script.
Entiendo que quiere tener esa Vista Parcial para ser autónoma. La idea es similar a los componentes cuando se usa Angular.
Mi forma sería mantener los scripts dentro de la Vista parcial tal como están. Ahora, el problema con eso es cuando se llama a Vista parcial, puede ejecutar el script allí antes que todos los otros scripts (que generalmente se agrega al final de la página de diseño). En ese caso, solo tiene que el guión de Vista parcial espera los otros guiones. Hay varias formas de hacer esto. El más simple, que he usado antes, está usando un evento
body
.En mi diseño, tendría algo en la parte inferior como este:
Luego, en mi Vista parcial (en la parte inferior):
Otra solución es usar una pila para empujar todos sus scripts y llamar a cada uno al final. Otra solución, como ya se mencionó, es el patrón RequireJS / AMD, que también funciona muy bien.
fuente
La primera solución que se me ocurre es usar ViewBag para almacenar los valores que se deben representar.
En primer lugar, nunca intenté si esto funciona desde una vista parcial, pero debería hacerlo.
fuente
ViewBag.RenderScripts = new List<string>();
en la parte superior de la página principal, luego llamó@Html.Partial("_CreateUpdatePartial",Model,ViewData)
, luego puso@section Scripts {@foreach (string script in ViewBag.RenderScripts) Scripts.Render(script); }}
. En vista parcial pongo@{ViewBag.RenderScripts = ViewBag.RenderScripts ?? new List<string>();ViewBag.RenderScripts.Add("~/bundles/jquery");}
.No puede necesitar usar secciones en vista parcial.
Incluir en su Vista parcial. Ejecuta la función después de cargar jQuery. Puede modificar la cláusula de condición para su código.
Julio Spader
fuente
Puede usar estos métodos de extensión : (Guardar como PartialWithScript.cs)
Usar así:
Ejemplo parcial: (_MyPartial.cshtml) Coloque el html en el if y el js en el else.
En su _Layout.cshtml, o donde quiera que se representen los scripts de los parciales, coloque lo siguiente (una vez): representará solo el javascript de todos los parciales en la página actual en esta ubicación.
Luego, para usar su parcial, simplemente haga esto: representará solo el html en esta ubicación.
fuente
Hay una manera de insertar secciones en vistas parciales, aunque no es bonita. Debe tener acceso a dos variables desde la Vista principal. Dado que parte del propósito de su vista parcial es crear esa sección, tiene sentido requerir estas variables.
Esto es lo que parece insertar una sección en la vista parcial:
Y en la página insertando la vista parcial ...
También puede usar esta técnica para definir los contenidos de una sección mediante programación en cualquier clase.
¡Disfrutar!
fuente
La idea de Plutón de una manera más agradable:
CustomWebViewPage.cs:
Views \ web.config:
Ver:
Parcial (_BackendSearchForm.cshtml):
Página de diseño:
fuente
Esto funcionó para mí, lo que me permitió ubicar conjuntamente JavaScript y HTML para una vista parcial en el mismo archivo. Ayuda con el proceso de pensamiento para ver html y partes relacionadas en el mismo archivo de vista parcial.
En la vista que usa la vista parcial llamada "_MyPartialView.cshtml"
En archivo de vista parcial
fuente
Resolví esto una ruta completamente diferente (porque tenía prisa y no quería implementar un nuevo HtmlHelper):
Envolví mi Vista parcial en una gran declaración if-else:
Luego, llamé a Parcial dos veces con un ViewData personalizado:
fuente
@Html.Partial("MyPartialViewScripts")
Tuve un problema similar, donde tenía una página maestra de la siguiente manera:
pero la vista parcial dependía de algunos JavaScript en la sección Scripts. Lo resolví codificando la vista parcial como JSON, cargándola en una variable de JavaScript y luego usándola para llenar un div, así:
fuente
Por supuesto, puede usar su Folder / index.cshtml como página maestra y luego agregar scripts de sección. Luego, en su diseño tiene:
y tu index.cshtml:
y funcionará en todas sus vistas parciales. Funciona para mi
fuente
Usando Mvc Core puede crear un TagHelper ordenado
scripts
como se ve a continuación. Esto podría fácilmente transformarse en unasection
etiqueta donde también se le da un nombre (o el nombre se toma del tipo derivado). Tenga en cuenta que la inyección de dependencia debe configurarse paraIHttpContextAccessor
.Al agregar scripts (por ejemplo, en un parcial)
Al generar los scripts (por ejemplo, en un archivo de diseño)
Código
fuente
Me encontré con un problema casi idéntico el otro día, excepto que la vista parcial fue una respuesta a una solicitud de AJAX. En mi situación, el parcial era en realidad una página completa, pero quería que fuera accesible como parcial desde otras páginas.
Si desea renderizar secciones de forma parcial, la solución más limpia es crear un nuevo diseño y usar una variable ViewBag. Esto no funciona
@Html.Partial()
o lo nuevo<partial></partial>
, usa AJAX.Vista principal (que desea representar como parcial en otro lugar):
Controlador:
_layoutPartial.cshtml (nuevo):
Luego usa AJAX en tu página.
Si desea renderizar la página en el diseño principal (no parcial), no la configure
ViewBag.Partial = true
. No se necesitan ayudantes HTML.fuente
Bueno, supongo que los otros carteles le han proporcionado un medio para incluir directamente una sección @ dentro de su parcial (mediante el uso de ayudantes html de terceros).
Pero, supongo que, si su script está estrechamente acoplado a su parcial, simplemente coloque su javascript directamente dentro de una
<script>
etiqueta en línea dentro de su parcial y termine con esto (solo tenga cuidado con la duplicación de script si tiene la intención de usar el parcial más de una vez en una sola vista);fuente
suponga que tiene una vista parcial llamada _contact.cshtml, su contacto puede ser legal (nombre) o un sujeto físico (nombre, apellido). su vista debe cuidar lo que se representa y eso se puede lograr con javascript. Por lo tanto, es posible que se necesite un renderizado retrasado y una vista interior de JS.
La única forma en que pienso, cómo se puede omitir, es cuando creamos una manera discreta de manejar tales problemas de IU.
También tenga en cuenta que MVC 6 tendrá un llamado componente de vista, incluso los futuros de MVC tenían algunas cosas similares y Telerik también admite tal cosa ...
fuente
Acabo de agregar este código en mi vista parcial y resolví el problema, aunque no está muy limpio, funciona. Debe asegurarse de que los ID de los objetos que está renderizando.
fuente
Tuve el problema similar resuelto con esto:
Supongo que es una buena manera de inyectar.
fuente