11
votes

ASP.NET MVC 3 Emplacement de modèles d'affichage et de modèles d'éditeur, comment?

Je vais fou, J'utilise MVCCONTRIB, pour créer un site pluggable à l'aide de zones portables, et tout fonctionne bien jusqu'à présent, sauf que lorsque j'ai commencé à utiliser des modèles MVC, ce qui se passe est si je mets les modèles dans le dossier correspondant de la vue fonctionnent, Exemples XXX

Mais ce que je veux, c'est la possibilité de créer des modèles communs définis et de l'utiliser à partir de l'application hôte ou de la zone portable, de manière à ce que j'ai créé une nouvelle zone portable appelée DisplayTempates (à Utilisez la possibilité de MVCConTrib de compiler des vues), voici la structure de la zone portable xxx

dans mon application hôte, j'ai créé un modèle de test et ajouté l'attribut uihint Xxx

mais cela ne fonctionne pas, je pensais donc que cela a quelque chose à voir avec un lieu de vues partielles, donc j'ai créé un moteur CustomView pour trouver des vues partielles dans cet endroit et enregistrer dans Global.Asax, voici une courte idée de Donc, je ne vous ennuierais pas avec le code complet xxx

Qu'est-ce qui est encore plus bizarre, c'est qu'il semble qu'il semble t Chapeau que uihint avec un emplacement explicite pour afficher le modèle, ne fonctionne pas, voici un exemple xxx

et oui xxx

Encore une fois désolé pour le long post, mais j'ai abandonné la recherche d'une solution, de sorte que toute aide serait totalement appréciée.


0 commentaires

5 Réponses :


2
votes

Je pense que vous n'avez pas eu de réponses, car il n'y en a pas: - (

J'ai cherché haut et bas les derniers jours à essayer de trouver une solution à cela (depuis que vous avez mentionné, cela a eu beaucoup de points de vue). Malheureusement, je ne trouve aucun moyen de remplacer cela.

Je pense que vous êtes coincé: (

EDIT: est tombé sur ce message pour lire des vues à partir d'une base de données au lieu du disque:

ASP.NET MVC Load Razor Vue de la base de données

Je me demande si les chambres d'affichage sont lues de cette façon. Si oui, vous pouvez essayer de les détourner et les lire d'un autre endroit (au lieu de dB)?


0 commentaires

13
votes

Danny est correct. Les modèles sont trouvés de la même manière que les vues partielles sont trouvées.

Par défaut, le WebFormviewengine et RazorViewengine vont rechercher les emplacements suivants pour un modèle.

pour les modèles d'affichage:

~ / vues / {contrôleur} / displaytemplates ~ / Vues / partagée / displaytemplates

pour les modèles d'éditeur:

~ / vues / {contrôleur} / éditeurs ~ / Vues / partagées / EditTorTemplates

Je pense que le nom des sous-répertoires (c.-à-d., "DisplayTemplates" et "EditTorTorplates") sont codés dur dans MVC quelque part (je sais que c'est une source ouverte et je pouvais le trouver, mais je suis ne va pas).

Je pense que le moyen le plus simple de changer quelque peu l'emplacement est de remplacer la viewEngine. Mon point de vue personnalisé est assez compliqué à ce stade, mais je soupçonne que vous pourriez vous éloigner avec ce qui suit.

Disons que vous voulez que vos modèles soient dans ~ / Vues / Modèles.

Créez une classe qui hérite du moteur de vue que vous utilisez maintenant (probablement WebFormViewEngine ou RazorViewEngine). Ajouter un constructeur vide. Il devrait ressembler à ceci: xxx

maintenant, ajoutez les lignes suivantes à la méthode Application_Start de global.asax.cs: xxx

À ce stade, compilez et exécutez votre application. Tout devrait fonctionner exactement comme il fonctionne maintenant. Vous utilisez fondamentalement le même moteur de vue que vous utilisiez avant.

Mais maintenant, nous souhaitons ajouter un emplacement à rechercher lors de la recherche de partielviews. Ceci est simplement fait en ajoutant aux partialviewLocalisationFormats . Donc, maintenant dans le constructeur de votre moteur de vision personnalisé, vous souhaitez ajouter au tableau de la classe de base, comme: xxx

quelques notes sur ce qui précède:

  • L'entrée ci-dessus le rendra afin que votre moteur d'affichage recherche le modèle d'affichage à chaîne à ~ / vues / modèles / displaytemplates / string.cshtml.
  • Le format de localisation dans ces moteurs de vue inclut l'extension de fichier, donc si vous utilisez RAZOR / C # Utiliser "CSHTML", RAZOR / VB Utilisez "VBHTML", WebForms Ajouter "ASPX" et "ASPX".
  • La façon dont je le fais au-dessus, j'ajoute mon format de localisation en haut de la liste, mais j'enregistre tous les emplacements par défaut. Vous pourriez envisager de supprimer ceux-ci.
  • Regardez les formats actuels et vous verrez que vous obtiendrez également un contrôleur dans la position {1} dans le format, de sorte que si vous souhaitiez avoir un répertoire de modèles sous chaque contrôleur, vous pourriez.
  • Attention, une fois que vous avez commencé à déplacer des objets avec un moteur de vue, il reçoit une dépendance. Vous pourriez vous retrouver tout autour.

    bonne chance.


2 commentaires

Arrivé à exécuter sur les valeurs codées durement que j'ai mentionnées dans ce post. Ils sont dans le code MVC dans \ mvc3 \ src \ systemwebmvc \ mvc \ html \ templatehelpers.cs. Il pourrait y avoir un moyen de remplacer la classe TemplateHelPers et de réécrire le dictionnaire ModeViewPaths, mais c'est probablement plus de travail que ce qu'il vaut la peine. La réécriture de la réécriture du dictionnaire quitte toujours les modèles sous forme de sous-répertoire de l'emplacement partielviews sans remplacement d'exécutant.


Le chemin correct (ou le plus récent?) Est \ src \ system.web.mvc \ html \ templatehelpers.cs



8
votes

Au lieu de créer une nouvelle viewEngine, vous pouvez facilement modifier les personnes existantes à l'exécution:

private void FixMvcTemplateAreaBug(string areaName)
{
    foreach (BuildManagerViewEngine viewEngine in ViewEngines.Engines)
    {
        List<string> viewLocations = 
                     new List<string>(viewEngine.PartialViewLocationFormats);

        foreach (var extension in viewEngine.FileExtensions)
            viewLocations.Add("~/Areas/" + areaName + 
                              "/Views/Shared/{0}." + extension);

        viewEngine.PartialViewLocationFormats = viewLocations.ToArray();
    }
}


0 commentaires

1
votes

Pardon Si j'ai manqué quelque chose de plus, mais y a-t-il une raison que la substitution de html.displayfor qui permet de spécifier le modèle ne fonctionnera pas ici? Par exemple: xxx

acclamations,


0 commentaires

1
votes

Cela pourrait être un peu tardif :) Mais cela est maintenant possible dans MVC 4. Les modèles génériques doivent être placés dans ~ / Vues / SharedTorTemplates

source


0 commentaires