J'ai la disposition suivante pour mon projet mvc:
- / Contrôleurs
- / Démo
- / Démo / DemoArea1Controller
- / Démo / DemoArea2Controller
- etc...
- / Vues
- / Démo
- /Demo/DemoArea1/Index.aspx
- /Demo/DemoArea2/Index.aspx
Cependant, quand j'ai ceci pour DemoArea1Controller
:
public class DemoArea1Controller : Controller
{
public ActionResult Index()
{
return View();
}
}
J'obtiens l'erreur "La vue 'index' ou son maître est introuvable", avec les emplacements de recherche habituels.
Comment puis-je spécifier que les contrôleurs dans l'espace de noms "Demo" recherchent dans le sous-dossier de la vue "Demo"?
asp.net-mvc
views
Daniel Schaffer
la source
la source
Réponses:
Vous pouvez facilement étendre WebFormViewEngine pour spécifier tous les emplacements dans lesquels vous souhaitez rechercher:
N'oubliez pas d'enregistrer le moteur de vue en modifiant la méthode Application_Start dans votre Global.asax.cs
la source
Désormais, dans MVC 6, vous pouvez implémenter l'
IViewLocationExpander
interface sans vous soucier des moteurs de vue:où
{0}
est le nom de la vue cible,{1}
- le nom du contrôleur et{2}
- le nom de la zone.Vous pouvez renvoyer votre propre liste d'emplacements, la fusionner avec default
viewLocations
(.Union(viewLocations)
) ou simplement les modifier (viewLocations.Select(path => "/AnotherPath" + path)
).Pour enregistrer votre expanseur d'emplacement de vue personnalisé dans MVC, ajoutez les lignes suivantes à la
ConfigureServices
méthode dans leStartup.cs
fichier:la source
Il existe en fait une méthode beaucoup plus simple que de coder en dur les chemins dans votre constructeur. Vous trouverez ci-dessous un exemple d'extension du moteur Razor pour ajouter de nouveaux chemins. Une chose dont je ne suis pas tout à fait sûr est de savoir si les chemins que vous ajoutez ici seront mis en cache:
Et votre Global.asax.cs
Une chose à noter: votre emplacement personnalisé aura besoin du fichier ViewStart.cshtml à sa racine.
la source
Si vous voulez simplement ajouter de nouveaux chemins, vous pouvez ajouter aux moteurs de vue par défaut et épargner quelques lignes de code:
de même pour
WebFormEngine
la source
Au lieu de sous-classer le RazorViewEngine, ou de le remplacer carrément, vous pouvez simplement modifier la propriété PartialViewLocationFormats de RazorViewEngine existante. Ce code va dans Application_Start:
la source
La dernière fois que j'ai vérifié, cela vous oblige à créer votre propre ViewEngine. Je ne sais pas s'ils ont rendu les choses plus faciles en RC1.
L'approche de base que j'ai utilisée avant le premier RC était, dans mon propre ViewEngine, de diviser l'espace de noms du contrôleur et de rechercher des dossiers correspondant aux parties.
ÉDITER:
Je suis retourné et j'ai trouvé le code. Voici l'idée générale.
la source
Essayez quelque chose comme ceci:
la source
Remarque: pour ASP.NET MVC 2, ils ont des chemins d'emplacement supplémentaires que vous devrez définir pour les vues dans 'Zones'.
La création d'un moteur de vue pour une zone est décrite sur le blog de Phil .
Remarque: Ceci est pour la version préliminaire 1 et est donc sujet à changement.
la source
La plupart des réponses ici, effacez les emplacements existants en appelant
ViewEngines.Engines.Clear()
, puis ajoutez-les à nouveau ... il n'est pas nécessaire de le faire.Nous pouvons simplement ajouter les nouveaux emplacements aux emplacements existants, comme indiqué ci-dessous:
Vous pouvez maintenant configurer votre projet pour utiliser ce qui précède
RazorViewEngine
dans Global.asax:Voir ce tutoriel pour plus d'informations.
la source