Ma principale motivation pour essayer de faire cela est d'obtenir du Javascript qui n'est requis que par un partiel en bas de page avec le reste du Javascript et non au milieu de la page où le partiel est rendu.
Voici un exemple simplifié de ce que j'essaie de faire:
Voici la mise en page avec une section Scripts juste avant le corps.
<!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>
Voici un exemple de vue utilisant cette disposition.
<h2>This is the view</h2>
@{Html.RenderPartial("_Partial");}
@section Scripts {
<script type="text/javascript">
alert("I'm a view.");
</script>
}
Et voici le rendu partiel de la vue.
<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>
}
Dans cet exemple, le balisage spécifié dans la vue est placé dans la section, mais le balisage du partiel ne l'est pas. Est-il possible de remplir une section à partir d'une vue partielle avec Razor? Sinon, quelles sont les autres méthodes pour obtenir du Javascript qui ne sont nécessaires que pour les partiels au bas de la page sans l'inclure globalement?
la source
Réponses:
La façon dont j'ai géré cela est d'écrire quelques méthodes d'extension dans la classe HtmlHelper. Cela permet aux vues partielles de dire qu'elles nécessitent un script, puis dans la vue de mise en page qui écrit la balise que j'appelle à ma méthode d'assistance pour émettre les scripts requis
Voici les méthodes d'aide:
Une fois que vous l'avez en place, votre vue partielle n'a plus qu'à appeler
@Html.RequireScript("/Path/To/Script")
.Et dans la section principale de la vue de mise en page, vous appelez
@Html.EmitRequiredScripts()
.Un avantage supplémentaire de ceci est qu'il vous permet d'éliminer les demandes de script en double. Si vous avez plusieurs vues / vues partielles qui nécessitent un script donné, vous pouvez supposer en toute sécurité que vous ne le sortirez qu'une seule fois
la source
Les vues partielles ne peuvent pas participer aux sections de leurs vues parentes.
la source
Vous pourriez avoir un deuxième partiel qui se charge uniquement d'injecter le javascript nécessaire. Placez-y plusieurs scripts autour des
@if
blocs, si vous le souhaitez:Cela pourrait évidemment être nettoyé un peu, mais ensuite, dans la
Scripts
section de votre vue:Encore une fois, cela ne gagnera peut-être pas de prix de beauté, mais cela fonctionnera.
la source
La manière la plus élégante de le faire est de déplacer les scripts de vue partielle dans un fichier séparé, puis de les rendre dans la section Scripts de la vue:
La vue partielle _ Partial.cshtml :
La vue partielle _ PartialScripts.cshtml avec des scripts uniquement:
la source
Installez le package nuget Forloop.HtmlHelpers - il ajoute des aides pour la gestion des scripts dans les vues partielles et les modèles d'éditeur.
Quelque part dans votre mise en page, vous devez appeler
Ce sera là où tous les fichiers de script et blocs de script seront affichés dans la page, je vous recommande donc de le placer après vos principaux scripts dans la mise en page et après une section de scripts (si vous en avez une).
Si vous utilisez The Web Optimization Framework avec bundling, vous pouvez utiliser la surcharge
afin que cette méthode soit utilisée pour écrire des fichiers de script.
Désormais, à chaque fois que vous souhaitez ajouter des fichiers de script ou des blocs dans une vue, une vue partielle ou un modèle, utilisez simplement
Les assistants veillent à ce qu'une seule référence de fichier de script soit rendue si elle est ajoutée plusieurs fois et garantit également que les fichiers de script sont rendus dans un ordre attendu, c'est-à-dire
la source
[Version mise à jour] Version mise à jour suite à la question @Necrocubus pour inclure les scripts en ligne.
Mes 2 cents, c'est un ancien post, mais toujours d'actualité, voici donc une mise à jour mise à jour de la solution de M. Bell qui fonctionne avec ASP.Net Core.
Il permet d'ajouter des scripts et des styles à la mise en page principale à partir de vues partielles et de sous-vues importées, et la possibilité d'ajouter des options aux importations de script / style (comme async defer, etc.):
la source
<text>
, ajoutez-le simplement sous forme de chaîne (vous pouvez toujours préfixer @ "" pour plusieurs lignes si vous préférez), et sans les<script>
balisesVous pouvez créer une nouvelle
Layout
page et envelopper le PartialView dans une vue complète qui est responsable du rendu du contenu et de toutes les sections de la bibliothèque.Par exemple, disons que j'ai le code suivant:
HomeController.cs
Lorsque la vue Pleine page est rendue, elle est généralement rendue en fusionnant deux fichiers:
About.cshtml
_Layout.cshtml
(ou tout ce qui est spécifié dans _ViewStart ou remplacé dans la page)Maintenant , supposons que vous vouliez effectuer le rendu en
About.cshtml
tant que vue partielle , peut-être en tant que fenêtre modale en réponse à un appel AJAX. Le but ici étant de ne renvoyer que le contenu spécifié dans la page à propos, les scripts et tout, sans tout le ballonnement inclus dans la_Layout.cshtml
mise en page principale (comme un full<html>
document ).Vous pouvez l'essayer comme ceci, mais il ne viendra avec aucun des blocs de section:
À la place, ajoutez une page de mise en page plus simple comme celle-ci:
_PartialLayout.cshtml
Ou pour prendre en charge une fenêtre modale comme celle-ci:
_ModalLayout.cshtml
Ensuite, vous pouvez spécifier une vue principale personnalisée dans ce contrôleur ou tout autre gestionnaire que vous souhaitez rendre le contenu et les scripts d'une vue simultanément
la source
Pour ceux qui recherchent la version aspnet core 2.0:
Ajoutez à votre mise en page après l'appel de la section de rendu des scripts:
Et dans votre vue partielle:
la source
Sur la base de la réponse de M. Bell et Shimmy ci-dessus, j'ajoute une fonction supplémentaire pour le script Bundle.
Exemple sur PartialView: - @ Html.RequireBundleStyles ("~ / bundles / fileupload / bootstrap / BasicPlusUI / css"); @ Html.RequireBundleScripts ("~ / bundles / fileupload / bootstrap / BasicPlusUI / js");
Exemple sur MasterPage: - @ Html.EmitRequiredBundleStyles ()
la source
Utilisez les
@using(Html.Delayed()){ ...your content... }
extensions de la réponse https://stackoverflow.com/a/18790222/1037948 pour afficher n'importe quel contenu (scripts ou simplement HTML) plus tard dans la page. L'interneQueue
doit garantir une commande correcte.la source
Cette fonctionnalité est également implémentée dans ClientDependency.Core.Mvc.dll. Il fournit les helpers html: @ Html.RequiresJs et @ Html.RenderJsHere (). Package Nuget: ClientDependency-Mvc
la source
Voici ma solution aux questions fréquemment posées "comment injecter des sections de vues partielles aux vues principales ou à la vue de mise en page principale pour asp.net mvc?". Si vous effectuez une recherche sur stackoverflow par mots-clés "section + partial", vous obtiendrez une assez grande liste de questions connexes, et des réponses données, mais aucune d'entre elles ne me semble élégante au moyen de la grammaire du moteur de rasoir. Je regarde donc le moteur Razor pour voir s'il pourrait y avoir une meilleure solution à cette question.
Heureusement, j'ai trouvé quelque chose qui m'intéresse sur la façon dont le moteur Razor effectue la compilation du fichier de modèle de vue (* .cshtml, * .vbhtml). (J'expliquerai plus tard), ci-dessous est mon code de la solution qui je pense est assez simple et assez élégante dans l'utilisation.
usage : Utiliser le code est également assez simple, et il a presque le même style que d'habitude. Il prend également en charge tous les niveaux des vues partielles imbriquées. c'est à dire. J'ai une chaîne de modèles de vue: _ViewStart.cshtml-> layout.cshtml-> index.cshtml -> [head.cshtml, foot.cshtml] -> ad.cshtml.
Dans layout.cshtml, nous avons:
Et dans index.cshtml, nous avons:
Et dans head.cshtml, nous aurions le code:
c'est la même chose dans foot.cshtml ou ad.cshtml, vous pouvez toujours définir la section Head ou Foot en eux, assurez-vous d'appeler @ Html.EnsureSection () une fois à la fin du fichier de vue partielle. C'est tout ce que vous devez faire pour vous débarrasser du problème soumis dans asp mvc.
Je partage simplement mon extrait de code pour que d'autres puissent en profiter. Si vous pensez que c'est utile, n'hésitez pas à augmenter mon avis. :)
la source