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.

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top