Comment spécifier l'emplacement d'une vue Mvc sera créée pour un contrôleur Mvc?
-
03-07-2019 - |
Question
Mise à jour importante
Depuis la publication de MVC 2.0 Preview 1, cette fonctionnalité a été intégrée au cadre même sous la forme de zones. Plus de détails sur le blog de Phil Haack ici
J'ai un contrôleur appelé ListManagerController. Ce contrôleur contient une méthode ActionResult appelée Index (). Lorsque je clique à droite sur Index dans Visual Studio et que je sélectionne Ajouter, la nouvelle vue est créée dans / Views / ListManager / Index.
Toutefois, je souhaite que la vue Index et toutes les vues suivantes soient créées dans / Vues / Gérer / ListManager /. Comment pourrais-je accomplir cela?
Modifier : cette question est un doublon de la question publiée ici . Il semble que mes compétences en matière de recherche me manquent au début.
La solution
L'emplacement des vues est lié à ViewFactory que vous utilisez. Autant que je sache, les moteurs de visualisation de formulaires Web ne prennent pas en charge les zones [Gérez dans votre exemple].
Spark le prend en charge et est très propre. Vous pouvez également mélanger et faire correspondre les formulaires Web et les affichages ne pas avoir à recréer tous vos points de vue.
UPDATE: On dirait que Phil Haack a un article de blog expliquant comment y parvenir. Son code est pour le RC, mais je pense que cela devrait bien compiler contre ASP.NET MVC RTM.
Autres conseils
Je sais que vous avez déjà accepté une réponse, mais voici ce que j’ai trouvé lors de l’expérimentation de la même idée, à l’aide de Le message de Phil Haack .
Vous devez d’abord disposer de votre propre ViewEngine pour rechercher des dossiers dans le dossier View. Quelque chose comme ça: (vous remarquerez qu'il ressemble beaucoup au code de région de Phil Haack)
public class TestViewEngine : WebFormViewEngine
{
public TestViewEngine()
: base()
{
MasterLocationFormats = new[] {
"~/Views/{1}/{0}.master",
"~/Views/Shared/{0}.master"
};
ViewLocationFormats = new[] {
"~/{0}.aspx",
"~/{0}.ascx",
"~/Views/{1}/{0}.aspx",
"~/Views/{1}/{0}.ascx",
"~/Views/Shared/{0}.aspx",
"~/Views/Shared/{0}.ascx"
};
PartialViewLocationFormats = ViewLocationFormats;
}
public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
{
ViewEngineResult rootResult = null;
//if the route data has a root value defined when mapping routes in global.asax
if (controllerContext.RouteData.Values.ContainsKey("root")) {
//then try to find the view in the folder name defined in that route
string rootViewName = FormatViewName(controllerContext, viewName);
rootResult = base.FindView(controllerContext, rootViewName, masterName, useCache);
if (rootResult != null && rootResult.View != null) {
return rootResult;
}
//same if it's a shared view
string sharedRootViewName = FormatSharedViewName(controllerContext, viewName);
rootResult = base.FindView(controllerContext, sharedRootViewName, masterName, useCache);
if (rootResult != null && rootResult.View != null) {
return rootResult;
}
}
//if not let the base handle it
return base.FindView(controllerContext, viewName, masterName, useCache);
}
private static string FormatViewName(ControllerContext controllerContext, string viewName) {
string controllerName = controllerContext.RouteData.GetRequiredString("controller");
string root = controllerContext.RouteData.Values["root"].ToString();
return "Views/" + root + "/" + controllerName + "/" + viewName;
}
private static string FormatSharedViewName(ControllerContext controllerContext, string viewName) {
string root = controllerContext.RouteData.Values["root"].ToString();
return "Views/" + root + "/Shared/" + viewName;
}
}
Dans votre Global.asax
, remplacez le ViewEngine par défaut par votre nom personnalisé, sous Application_Start
:
ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new TestViewEngine());
Maintenant, lorsque vous définissez des itinéraires dans Global.asax
, vous devez définir une valeur racine
indiquant le dossier à rechercher dans les dossiers View de la manière suivante:
routes.MapRoute(
"ListManager",
"ListManager/{action}/{id}",
new { controller = "ListManager", action = "Index", id = "", root = "Manage" }
);
Cette question est TRÈS souvent une répétition de cette question
alors je vais citer ma réponse à celle-là.
Je suis venu avec une solution différente cela ne m'a pas obligé à rouler mon propre afficher le moteur.
En gros, je voulais garder MVC comme " Convention " conduit que possible, mais je toujours voulu organiser tous mes " Admin " vues sous ~ / Vues / Admin dossier.
Exemple:
- ~ / Vues / Admin / Utilisateur /
- ~ / Vues / Admin / Nouvelles /
- ~ / Vues / Admin / Blog /
Ma solution était de créer une nouvelle base classe pour mon administrateur spécifique contrôleurs et " force " le chemin de la vue de ce contrôleur.
J'ai un article de blog et un exemple de code ici: Organisez vos vues dans ASP.Net MVC