J'ai cette section définie dans mon _Layout.cshtml
@RenderSection("Scripts", false)
Je peux facilement l'utiliser depuis une vue:
@section Scripts {
@*Stuff comes here*@
}
Ce qui me pose problème, c'est comment injecter du contenu dans cette section à partir d'une vue partielle.
Supposons que ceci soit ma page d'affichage:
@section Scripts {
<script>
//code comes here
</script>
}
<div>
poo bar poo
</div>
<div>
@Html.Partial("_myPartial")
</div>
J'ai besoin d'injecter du contenu à l'intérieur de la Scripts
section à partir d' _myPartial
une vue partielle.
Comment puis-je faire ceci?
Réponses:
Les sections ne fonctionnent pas dans les vues partielles et c'est par conception. Vous pouvez utiliser certains assistants personnalisés pour obtenir un comportement similaire, mais honnêtement, c'est la responsabilité de la vue d'inclure les scripts nécessaires, pas celle du partiel. Je recommanderais d'utiliser la section @scripts de la vue principale pour ce faire et de ne pas vous soucier des scripts partiels.
la source
C'est une question assez populaire, donc je posterai ma solution.
J'ai eu le même problème et bien que ce ne soit pas idéal, je pense que cela fonctionne assez bien et ne rend pas le partiel dépendant de la vue.
Mon scénario était qu'une action était accessible par elle-même mais pouvait également être intégrée dans une vue - une carte Google.
Dans mon
_layout
j'ai:À mon
index
avis, j'ai:À mon
clients
avis, j'ai (toute la carte et assoc. Html):Ma
Clients_Scripts
vue contient le javascript à afficher sur la pageDe cette façon, mon script est isolé et peut être rendu dans la page si nécessaire, la
body_scripts
balise n'étant rendue que lors de la première occurrence que le moteur de visualisation du rasoir trouve.Cela me permet de tout séparer - c'est une solution qui fonctionne assez bien pour moi, d'autres peuvent avoir des problèmes avec elle, mais elle corrige le trou "par conception".
la source
À partir des solutions de ce fil , j'ai trouvé la solution probablement trop compliquée suivante qui vous permet de retarder le rendu de tout html (scripts aussi) dans un bloc using.
USAGE
Créer la "section"
Scénario typique: dans une vue partielle, n'incluez le bloc qu'une seule fois, quel que soit le nombre de répétitions de la vue partielle dans la page:
Dans une vue partielle, incluez le bloc pour chaque utilisation du partiel:
Dans une vue partielle, n'incluez le bloc qu'une seule fois, quel que soit le nombre de répétitions du partiel, mais rendez-le plus tard spécifiquement par son nom
when-i-call-you
:Rendre les "sections"
(c'est-à-dire afficher la section retardée dans une vue parent)
CODE
la source
isOnlyOne
, mais seulement si vous voulez le rendre à un emplacement spécifique par son nom, fournissez-vous l'identifiant, sinon, il est vidéHtml.RenderDelayed()
.J'ai eu ce problème et j'ai utilisé cette technique.
C'est la meilleure solution que j'ai trouvée, qui est très flexible.
Veuillez également voter ici pour ajouter le support de la déclaration de section cumulative
la source
Si vous avez un besoin légitime d'en exécuter à
js
partir d'unpartial
, voici comment vous pouvez le faire,jQuery
est requis:la source
Suivant le principe discret , il n'est pas tout à fait nécessaire pour "_myPartial" d'injecter du contenu directement dans la section des scripts. Vous pouvez ajouter ces scripts de vue partielle dans un
.js
fichier séparé et les référencer dans la section @scripts de la vue parent.la source
Il y a une faille fondamentale dans notre façon de penser le Web, en particulier lors de l'utilisation de MVC. Le défaut est que JavaScript est en quelque sorte la responsabilité de la vue. Une vue est une vue, JavaScript (comportemental ou autre) est JavaScript. Dans le modèle MVVM de Silverlight et WPF, nous sommes confrontés à «voir d'abord» ou «modèle d'abord». Dans MVC, nous devons toujours essayer de raisonner du point de vue du modèle et JavaScript fait partie de ce modèle à bien des égards.
Je suggérerais d'utiliser le modèle AMD (j'aime moi-même RequireJS ). Séparez votre JavaScript en modules, définissez vos fonctionnalités et connectez-vous à votre code HTML à partir de JavaScript au lieu de compter sur une vue pour charger le JavaScript. Cela nettoiera votre code, séparera vos préoccupations et vous facilitera la vie d'un seul coup.
la source
window
objet, et j'inclus des scripts de bibliothèque avant tout partiel.Le but de l'OP est qu'il veuille définir des scripts en ligne dans sa vue partielle, ce que je suppose que ce script est spécifique uniquement à cette vue partielle, et avoir ce bloc inclus dans sa section de script.
Je comprends qu'il veut que cette vue partielle soit autonome. L'idée est similaire aux composants lors de l'utilisation d'Angular.
Ma façon serait de garder les scripts dans la vue partielle tels quels. Maintenant, le problème avec cela est lors de l'appel de la vue partielle, il peut y exécuter le script avant tous les autres scripts (qui sont généralement ajoutés au bas de la page de disposition). Dans ce cas, il suffit que le script Vue partielle attende les autres scripts. Il y a plusieurs moyens de le faire. Le plus simple, que j'ai utilisé auparavant, utilise un événement sur
body
.Sur ma mise en page, j'aurais quelque chose en bas comme ceci:
Puis sur ma vue partielle (en bas):
Une autre solution consiste à utiliser une pile pour envoyer tous vos scripts et appeler chacun à la fin. Une autre solution, comme déjà mentionné, est le modèle RequireJS / AMD, qui fonctionne très bien également.
la source
La première solution à laquelle je peux penser est d'utiliser ViewBag pour stocker les valeurs qui doivent être rendues.
Onestly je n'ai jamais essayé si ce travail d'une vue partielle, mais il devrait imo.
la source
ViewBag.RenderScripts = new List<string>();
en haut de la page principale, puis appelé@Html.Partial("_CreateUpdatePartial",Model,ViewData)
, puis mis@section Scripts {@foreach (string script in ViewBag.RenderScripts) Scripts.Render(script); }}
. Dans la vue partielle, je mets@{ViewBag.RenderScripts = ViewBag.RenderScripts ?? new List<string>();ViewBag.RenderScripts.Add("~/bundles/jquery");}
.Vous ne devez pas utiliser des sections en vue partielle.
Inclure dans votre vue partielle. Il exécute la fonction après le chargement de jQuery. Vous pouvez modifier la clause de condition pour votre code.
Julio Spader
la source
Vous pouvez utiliser ces méthodes d'extension : (Enregistrer en tant que PartialWithScript.cs)
Utilisez comme ceci:
Exemple partiel: (_MyPartial.cshtml) Mettez le html dans le if et le js dans le else.
Dans votre _Layout.cshtml, ou partout où vous voulez que les scripts des partiels soient rendus, mettez ce qui suit (une fois): Il rendra uniquement le javascript de tous les partiels sur la page en cours à cet emplacement.
Ensuite, pour utiliser votre partiel, faites simplement ceci: il ne rendra que le html à cet emplacement.
la source
Il existe un moyen d'insérer des sections dans des vues partielles, mais ce n'est pas joli. Vous devez avoir accès à deux variables à partir de la vue parent. Puisqu'une partie du but même de votre vue partielle est de créer cette section, il est logique d'exiger ces variables.
Voici à quoi ressemble l'insertion d'une section dans la vue partielle:
Et dans la page insérant la vue partielle ...
Vous pouvez également utiliser cette technique pour définir le contenu d'une section par programme dans n'importe quelle classe.
Prendre plaisir!
la source
L'idée de Pluton d'une manière plus agréable:
CustomWebViewPage.cs:
Vues \ web.config:
Vue:
Partielle (_BackendSearchForm.cshtml):
Page de mise en page:
la source
Cela a fonctionné pour moi, me permettant de co-localiser javascript et html pour une vue partielle dans le même fichier. Aide au processus de réflexion pour voir le HTML et la partie associée dans le même fichier de vue partielle.
Dans la vue qui utilise la vue partielle appelée "_MyPartialView.cshtml"
Dans le fichier de vue partielle
la source
J'ai résolu ce problème complètement différent (parce que j'étais pressé et que je ne voulais pas implémenter un nouveau HtmlHelper):
J'ai enveloppé ma vue partielle dans une grande déclaration if-else:
Ensuite, j'ai appelé le partiel deux fois avec un ViewData personnalisé:
la source
@Html.Partial("MyPartialViewScripts")
J'ai eu un problème similaire, où j'avais une page maître comme suit:
mais la vue partielle dépendait de certains JavaScript dans la section Scripts. Je l'ai résolu en encodant la vue partielle en JSON, en la chargeant dans une variable JavaScript, puis en l'utilisant pour remplir un div, donc:
la source
vous pouvez choisir d'utiliser un dossier / index.cshtml comme page maître, puis ajouter des scripts de section. Ensuite, dans votre mise en page, vous avez:
et votre index.cshtml:
et cela fonctionnera sur toutes vos vues partielles. Ça marche pour moi
la source
En utilisant Mvc Core, vous pouvez créer un TagHelper bien rangé
scripts
comme indiqué ci-dessous. Cela pourrait facilement être transformé en unesection
balise où vous lui donnez également un nom (ou le nom est tiré du type dérivé). Notez que l'injection de dépendances doit être configurée pourIHttpContextAccessor
.Lors de l'ajout de scripts (par exemple dans un partiel)
Lors de la sortie des scripts (par exemple dans un fichier de mise en page)
Code
la source
J'ai rencontré un problème presque identique l'autre jour, sauf que la vue partielle était une réponse à une demande AJAX. Dans ma situation, le partiel était en fait une page entière, mais je voulais qu'il soit accessible en tant que partiel à partir d'autres pages.
Si vous souhaitez rendre des sections dans un partiel, la solution la plus propre consiste à créer une nouvelle disposition et à utiliser une variable ViewBag. Cela ne fonctionne pas avec
@Html.Partial()
ou le nouveau<partial></partial>
, utilisez AJAX.Vue principale (que vous souhaitez rendre en tant que partielle ailleurs):
Manette:
_layoutPartial.cshtml (nouveau):
Utilisez ensuite AJAX dans votre page.
Si vous souhaitez rendre la page dans la mise en page principale (pas partielle), ne définissez pas
ViewBag.Partial = true
. Aucun assistant HTML n'est nécessaire.la source
Eh bien, je suppose que les autres affiches vous ont fourni un moyen d'inclure directement une @section dans votre partiel (en utilisant des assistants html tiers).
Mais, je pense que, si votre script est étroitement couplé à votre partiel, mettez simplement votre javascript directement dans une
<script>
balise en ligne dans votre partiel et terminez-le (faites juste attention à la duplication de script si vous avez l'intention d'utiliser le partiel plus d'une fois en une seule vue);la source
supposons que vous ayez une vue partielle appelée _contact.cshtml, votre contact peut être un sujet légal (nom) ou physique (prénom, nom). votre vue doit prendre soin de ce qui est rendu et qui peut être obtenu avec javascript. un rendu différé et une vue intérieure JS peuvent donc être nécessaires.
la seule façon dont je pense, comment cela peut être omis, c'est quand nous créons une manière discrète de gérer ces problèmes d'interface utilisateur.
Notez également que MVC 6 aura un soi-disant composant d'affichage, même les futurs MVC avaient des choses similaires et Telerik prend également en charge une telle chose ...
la source
Je viens d'ajouter ce code sur ma vue partielle et j'ai résolu le problème, mais pas très propre, cela fonctionne. Vous devez vous assurer que les ID des objets que vous rendez.
la source
J'ai eu le problème similaire résolu avec ceci:
C'est une jolie façon d'injecter i guesse.
la source