11
votes

Indice / fluide pour les noms de section de rasoir?

J'ai donc un cas où la mise en page a évolué pour devenir plus compliquée. Il y a les choses habituelles telles que @section style compris {...} code>, puis d'autres sections qui définissent toutes sortes de choses que chaque page peut éventuellement (mais presque toujours) spécifier comme la structure des pages actuelles Breadcumb . La raison pour laquelle toutes ces choses sont des sections est parce qu'elles sont intégrées à la structure de la mise en page.

Je me trouve faire des copies des pages précédentes, car il y a 8 sections différentes, plutôt que d'essayer de me souvenir de l'orthographe exacte, ou copier / pâte de pièce. p>

Je pense que cela serait préférable de créer une API fluide pour ceux-ci afin d'avoir un objet qui a 8 fonctions, chacun retournant l'objet lui-même, afin que vous puissiez faire quelque chose comme sections.style (un modèle de texte MVC ou un rasoir Delgate?). Breadcrumb (etc.) P>

L'objectif principal est de pouvoir coder ces sections de manière guidée et de saisir fortement les noms. de compter sur une typage parfaite ou une copie / pâte. P>

Cependant, les extensions / aides à Razor retourner mvchtmlstring, et j'imagine qu'une @section est représentée par quelque chose de complètement différent. P>

Ne vous posez pas écrire une solution complète pour moi, mais quelques idées sur la façon de précéder. p>

Quel objet doit-il revenir à une assistante pour représenter un @s ection code> Déclaration? STRUT> I.E. l'analogie d'un mvchtmlling. p>

Strort> Que suggéreriez-vous le type de paramètre pour les méthodes fluides, telles que le style ou la chaussette? Strong> J'aimerais que le rasoir soit ressemblant à une capacité à écrire du rasoir dans les accessoires bouclés de la déclaration de section. Par exemple, la possibilité d'accéder aux variables locales déclarées sur la page Razor, comme vous pouvez le faire avec une déclaration de section régulière. Je ne veux pas quelque chose comme une concaténation de chaîne comme .Somesection ("

tas de HTML bourré dans une chaîne div>") code> p> P> En d'autres termes , si beaucoup de mes pages CSHTML commencent quelque chose comme p>
@{
  string title = "Edit Person"
  ViewBag.Title = title;
}
@Sections
.Styles(@<text>
  .someOneOffPageSpecificStyle { width:59px }
</text>)
.Javascript(@<text>
  //javascript includes which the layout will place at the bottom...
</text>)
.Breadcrumb(@<text>
  <a ...>Parent Page</a> &gt; <a ...>Sub Page</a> &gt; @title
</text>)


4 commentaires

Pourquoi avez-vous tant de sections qui ne sont pas assemblées dans une mise en page commune? (Et je ne pense pas que vous puissiez, vous devrez simplement déclarer les sections, puis appeler vos méthodes d'extension à l'intérieur de chacun)


Ils sont assemblés dans une mise en page commune. Vous pouvez avoir de nombreuses sections définies dans différentes parties d'une mise en page. Le Breadcrumbe apparaît dans un endroit, les styles dans un autre, etc., mais ils sont tous dans la même mise en page.


Alors pourquoi voudriez-vous une méthode d'assistance pour générer toutes ces sections pour vous puisque vous ne le feriez que dans la mise en page commune?


Vous le ferez plus d'une fois, vous le ferez pour chaque CSHTML qui utilise cette mise en page. Les sections de la mise en page ont une déclaration de contrepartie dans chaque page CSHTML. Donc, même si vous utilisez une mise en page commune, chaque CSHTML définira ses propres sections, mais les noms de section doivent correspondre aux noms de la mise en page. C'est un moyen pour la disposition d'exposer des sections personnalisables de la page. La plupart des projets MVC sont par défaut avec une sorte de style et de section JavaScript, car chaque * .cshtml ne peut pas inclure d'une balise à tête et que le JavaScript doit être à la fin, la mise en page fournit une section


3 Réponses :


2
votes

Le plus probablement ce n'est pas possible (à l'aide de sections).

Nous devons d'abord comprendre comment MVC fonctionne sous la hotte. Nous écrivons des fichiers cshtml, mais ces fichiers seront éventuellement compilés dans un .NET. Classe qui est instanciée puis des méthodes sont exécutées (à un minimum nu exécuter () ) qui (la plupart du temps) écrit sur le tampon de réponse pour IIS à revenir (très similaire sinon la même chose que comment < Un href = "http://msdn.microsoft.com/en-us/library/system.web.mvc.html.web.mvc.html.web.mvc.html.web.mvc.hrenderaction(v=vs.98).aspx" rel = "Nofollow Noreferrer"> Renderaction < / a> Travaux - invoque une méthode d'action pour enfants et rend le résultat en ligne dans la vue parent ). Les htmlhelpers (ou tous les aides personnalisés) sont simplement appelés à partir de la classe instanée (en tant que délégués), afin qu'ils ne puissent s'exécuter qu'une fois que le code dans les fichiers CSHTML est compilé.

le système.web.razor.generator.sectioncodedenerator. Nécessite une définition de chaîne pour créer des sections. Donc, lorsque vous définissez une section, la chaîne doit exister dans le fichier CSHTML avant que le fichier ne soit compilé, car HTMLHelper ou / et les aides personnalisés ne seront pas exécutés tant que le fichier n'est pas compilé, il n'y a pas de moyen d'écrire une classe ou un objet qui Peut mettre à jour le fichier cshtml avant qu'il ne soit compilé.

Ce que vous peut peut écrire votre propre HTMLhelper ou d'autres aides personnalisés pour faire quelque chose de similaire à quelles sections fournissent (sans utiliser de sections ). Par exemple J'ai écrit cela parce que Je devais écrire JavaScript depuis des vues partielles et / ou des modèles (que vous ne pouvez pas faire avec des sections) . Si vous devez utiliser des sections, cela peut ne pas aider.

Le code suivant est exemple Ce n'est pas la façon dont le rasoir fonctionne réellement (du tout, après avoir examiné le code ). Mais pour faire un sens de cet exemple, je vais utiliser un code Razor-ish comme code et des conventions de nommer.

layout.cshtml xxx

index.cshtml < / p> xxx

peut être compilé dans une classe qui ressemble à: xxx


8 commentaires

Je vais jeter un coup d'oeil à ça. On dirait que le général qui fonctionnera. Cela résoudrait également l'autre problème sans rapport avec lequel vous parlez d'incapacité de définir des sections en partiels.


Mais ces fichiers seront éventuellement compilés dans une classe .NET Pouvez-vous dire la signification de la classe complète .NET?


Classe publique MyClass {}


"Lorsque vous définissez une section, la chaîne doit exister dans le fichier CSHTML avant que le fichier soit compilé", je suis confondu à ce sujet. Comment les sections contiennent-elles des appels vers des aides et des variables de référence manipulées? Comme dans mon exemple, la variable @title est référencée. Si les aides ne sont pas encore appelés et que le générateur de code de section nécessite une chaîne, comment les résolvez-t-il à une chaîne? En source de sectionCODEGENERATOR, il semble que cela soit referré, car il semble traiter la section du corps en tant que délégué: WriteArtLambdadelegate . De toute façon, vous avez raison, l'exécution semble différée, alors les aides ne fonctionneront pas.


Juste pour m'assurer que je suis clair, la sectionCodeGenerator s'appelle-t-elle pendant la compilation? Ou avant quand le fichier est analysé? Et lorsque vous dites "HTMLHELPER ou / et des aides personnalisés ne seront pas exécutés tant que le fichier est compilé" Je suppose que vous vouliez dire "... ** après ** le fichier est compilé"? (Ce qui est en quelque sorte impliqué par le passé, mais au début, cela ressemblait comme si vous disiez qu'ils sont exécutés pendant la compilation)


Re: * Votre premier commentaire * - Ne confondez pas la définition d'une section @section (par exemple dans une mise en page) avec le code fourni pour une section à utiliser (dans la vue) . La est une chaîne, compilée à être utilisée pour emplacer un code de section dans une vue (compilée également). Cette chaîne doit exister avant que la mise en page soit compilée. Les aides sont appelés à * Exécution du temps * pour exécuter du code pour renvoyer des valeurs de sorte qu'un assistant ne puisse pas définir un nom de section basé sur le moment où le code s'exécute.


Re: SectionCodeGenerator s'appelle pendant la compilation? Ou avant, lorsque le fichier est analysé? Je suppose que cela est analysé puis compilé, mais cela n'a pas d'importance parce que a d'être compilé avec succès dans une classe. La section SectionCodeGenerator est interne à MVC, donc si vous envisagez de faire une forte levée pour changer la manière dont cela fonctionne, il n'y a pas de différence entre analysé / compilé.


RE: * HTMLHelper ou / et les aides personnalisés ne seront pas exécutés tant que le fichier est compilé "Je suppose que vous vouliez dire" ... ** après ** le fichier est compilé "* - Je dois avoir dit HTMLhelper ou / et des aides personnalisées ne peut pas être exécuté tant que le fichier n'est pas compilé. HTMLHelper et les aides clients ne seront pas exécutés (uniquement référencés) lorsque la vue / la mise en page est compilée.



0
votes

Vous pouvez aborder le problème d'une direction différente - à l'aide de modèles T4.

Si la structure de votre mise en page est désormais raisonnablement stable (c.-à-d. VOTRE. VOTRE. VOTRE. VOTRE. VOTRE. VOTRE. VOTRE. VOTRE. VOTRE. VOTRE. VOTRE. VOTRE. VOTRE. VOTRE. VOTRE. Vous n'ayez pas d'ajouter et de supprimer des sections fréquemment) et tout ce que vous voulez, vous devez arrêter de copier et coller des choses lors de la création de nouveaux points de vue - cela fonctionnerait probablement très bien. Cela créera les points de vue à vos spécifications - vous pouvez faire des choses assez intelligentes avec réflexion et autre logique

Il y a un nuget pour charger les modèles de code - Recherchez "Codetempates" - et ils sont assez simples à utiliser.


3 commentaires

Cela fonctionnerait, mais pour le rendre fortement tapé, les types devraient être compilés dans une bibliothèque de classe pour les modèles T4 à utiliser. Ce serait complexe.


Je ne suis pas sûr que je vous suis là-bas - quelle partie du modèle T4 aurait-il besoin de faire "fortement typé"?


Question OP énoncée L'objectif principal est de pouvoir coder ces sections de manière guidée et de saisir fortement les noms au lieu de s'appuyer sur la typage parfaite ou la copie / coller parfaite. Pour que le modèle T4 utilise un Type fortement saisi, il doit être défini dans une bibliothèque de classe compilée de sorte qu'elle puisse également être utilisée en dehors du modèle T4 de la vue (sinon, les vues définissant des sections ne seront pas fortement typées).



1
votes

Si vous avez Resharper puis je suggère un modèle de code en direct (un puissant extrait).

Vous pouvez Créer un modèle avec un seul paramètre. La source macro de ce paramètre peut être une liste de valeurs délimitées par des virgules. Lorsque vous utilisez le modèle / l'extrait, il vous présentera une boîte IntelliSense avec vos noms de section disponibles pour la sélection.

En supposant que les noms des sections que vous utilisez ne changent pas autant vous ne devriez pas avoir à modifier le modèle très souvent pour inclure de nouveaux noms de section.


0 commentaires