Wie man den Speicherort eine Mvc-Ansicht wird für einen Mvc-Controller erstellt werden?
-
03-07-2019 - |
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.
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