Frage

  

Wichtiges Update
  Seit der Veröffentlichung von MVC 2.0 Preview 1 Diese Funktion wurde als Teil des eigentlichen Rahmens selbst in Form von Bereichen umgesetzt. Weitere Details verfügbar über Phil Haack Blog hier

Ich habe einen Controller namens ListManagerController. Diese Steuerung enthält eine Action Methode aufgerufen Index (). Wenn ich richtig cick auf Index in Visual Studio und wählen Sie Add-Ansicht die neue Ansicht in / Ansichten / Listmanager / Index erstellt.

Allerdings mag ich die Index-Ansicht und alle folgenden Ansichten in / Ansichten / erstellt werden verwalten / Listmanager /. Wie würde ich das erreichen?

Bearbeiten : Es wurde, dass diese Frage darauf hingewiesen, ein Duplikat der Frage geschrieben hier . Es scheint, dass meine Suche Fähigkeiten versagt mich zunächst.

War es hilfreich?

Lösung

Die Lage der Ansichten an die ViewFactory gebunden Sie verwenden. AFAIK die Web-Formulare Motoren sehen nicht Bereichen unterstützen [Verwalten in Ihrem Beispiel].

Funken diese unterstützt und ist sehr sauber, können Sie auch Web-Formulare mischen und anpassen und funken Ansichten, so dass Sie don ‚t haben alle Ihre Ansichten neu erstellen.

UPDATE: Sieht aus wie Phil Haack eine Blog-Post , wie dies zu erreichen. Sein Code ist für den RC, aber ich denke, dass gegen ASP.NET MVC RTM Fein kompilieren sollte.

Andere Tipps

Ich weiß, dass Sie schon eine Antwort akzeptiert, aber hier ist, was ich kam mit, während sie mit der gleichen Idee zu experimentieren, mit Hilfe von Phil Haack Post .

Zuerst müssen Sie Ihre eigene Viewengine haben für Ordner unter Ordner anzeigen zu suchen. Etwas wie folgt aus: (Sie werden feststellen, dass es viel wie Phil Haack Bereiche Code sieht)

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;
    }
}

Dann in Ihrem Global.asax ersetzt die Standard-Viewengine mit Ihrem eigenen ein, auf Application_Start:

ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new TestViewEngine());

Wenn Sie nun Routen in Global.asax definieren, müssen Sie den Ordner einen root Wert gesetzt, der anzeigt unter Ansicht Ordner zu suchen, etwa so:

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

Diese Frage ist sehr viel eine Wiederholung von diese Frage

also werde ich zitiere meine Antwort darauf hier.

  

Ich kam mit einer anderen Lösung nach oben   dass bedurften mich nicht meine eigene Rolle   Ansicht Motor.

     

Im Grunde wollte ich MVC halten, wie   „Übereinkommen“ wie möglich gefahren, aber ich   wollte immer noch alle meine organisieren   "Admin" Ansichten unter ~ / Views / Admin   Ordner.

     

Beispiel:

     
      
  • ~ / Views / Admin / Benutzer /
  •   
  • ~ / Views / Admin / News /
  •   
  • ~ / Views / Admin / Blog /
  •   
     

war meine Lösung eine neue Basis zu schaffen   Klasse für meine spezielle Admin   Steuerungen und „Kraft“ der Weg zum   die Ansicht für diesen Controller.

     

Ich habe eine Blog-Post und Beispielcode   hier: organisieren Sie Ihre Ansichten in ASP.Net   MVC

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top