0 votes

Comment spécifier l'emplacement où une vue Mvc sera créée pour un contrôleur Mvc ?

Mise à jour importante
Depuis la sortie de MVC 2.0 Preview 1, cette fonctionnalité a été implémentée dans le cadre même du framework sous la forme d'Areas. Plus de détails sur le blog de Phil Haack aquí

J'ai un contrôleur appelé ListManagerController. Ce contrôleur contient une méthode ActionResult appelée Index(). Lorsque je fais un clic droit sur Index dans Visual Studio et que je sélectionne Add View, la nouvelle vue est créée dans /Views/ListManager/Index.

Cependant, je souhaite que la vue Index et toutes les vues suivantes soient créées dans /Views/. Gérer /ListManager/. Comment faire ?

Editer : Il a été souligné que cette question est un duplicata de la question affichée. aquí . Il semble que mes compétences en matière de recherche m'aient fait défaut au départ.

3voto

Andrew Burns Points 2435

L'emplacement des vues est lié à la ViewFactory que vous utilisez. AFAIK, les moteurs de vues des formulaires web ne supportent pas les zones [Manage dans votre exemple].

Etincelle Vous pouvez également mélanger les formulaires web et les vues spark afin de ne pas avoir à recréer toutes vos vues.

UPDATE : On dirait que Phil Haack a un article de blog sur la manière d'y parvenir. Son code est pour la RC, mais je pense qu'il devrait compiler correctement avec ASP.NET MVC RTM.

1voto

çağdaş Points 10552

Je sais que vous avez déjà accepté une réponse, mais voici ce que j'ai trouvé en expérimentant la même idée, avec l'aide de Le post de Phil Haack .

Tout d'abord, vous devez avoir votre propre ViewEngine pour rechercher les dossiers dans le dossier View. Quelque chose comme ceci : (Vous remarquerez que cela ressemble beaucoup au code des zones 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;
    }
}

Ensuite, dans votre Global.asax remplacer le ViewEngine par défaut par votre propre ViewEngine, sur 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 un root indiquant le dossier à rechercher dans les dossiers View, comme par exemple :

routes.MapRoute(
    "ListManager",
    "ListManager/{action}/{id}",
    new { controller = "ListManager", action = "Index", id = "", root = "Manage" }
 );

0voto

datacop Points 568

Cette question est en fait une répétition de la question suivante cette question

Je citerai donc ici ma réponse à cette question.

J'ai trouvé une solution différente qui ne m'obligeait pas à déployer mon propre moteur de vue.

En fait, je voulais "convention" que possible, mais je voulais quand même mais je voulais quand même organiser tous mes vues "Admin" sous le pli ~/Views/Admin dans le dossier ~/Views/Admin.

Exemple :

  • ~/Views/Admin/User/
  • ~/Views/Admin/News/
  • ~/Views/Admin/Blog/

Ma solution a été de pour mes contrôleurs admin et de "forcer" le chemin vers la vue pour ce contrôleur.

J'ai un article de blog et un exemple de code ici : Organisez vos vues en ASP.Net MVC

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X