Da ich derzeit ein größeres Projekt plane und vor habe dieses Projekt mit ASP:Net MVC umzusetzen, stoße ich ab und zu auf Dinge die mir in der Default-Implementierung nicht so passen und versuche dann dafür Lösungen zu finden. Da ich in dem neuen Projekt ASP.Net MVC und ASP.Net WebForms kombinieren werde empfinde ich es als wichtig, dass es eine gute Projekt-Struktur gibt.
Die Standard-Struktur ist folgende:
Project-Root
Mein Ziel:
Project-Root
MVC
Was brauchen wir Dafür?:
- Eine eigene ControllerFactory
- Einen eigenen ViewLocator
ViewLocator-Source:
using System.Web.Mvc;
namespace PPM.BusinessLayer.Web.MVC
{ public class PPMViewLocator : ViewLocator
{ public PPMViewLocator()
{ ViewLocationFormats = new[]
{ "~/MVC/Views/{1}/{0}.aspx", "~/MVC/Views/{1}/{0}.ascx", "~/MVC/Views/Shared/{0}.aspx", "~/MVC/Views/Shared/{0}.ascx" };
MasterLocationFormats = new[]
{ "~/MVC/Views/{1}/{0}.master", "~/MVC/Views/Shared/{0}.master" };
}
}
}
Der Platzhalter {1} wird später durch den Controller-Name ersetzt und der Platzhalter {0} wird später durch den View-Name ersetzt.
ControllerFactory-Source:
using System.Web.Mvc;
using System.Web.Routing;
namespace PPM.BusinessLayer.Web.MVC
{ public class PPMControllerFactory : DefaultControllerFactory
{ protected override IController CreateController(RequestContext requestContext, string controllerName)
{ Controller controller = (Controller)base.CreateController(requestContext, controllerName);
((WebFormViewEngine) controller.ViewEngine).ViewLocator = new PPMViewLocator();
return controller;
}
}
}
Hier leiten wir von der DefaultControllerFactory ab und überschreiben die CreateController Methode. In der Methode lassen wir die Basis den Controller erzeugen und setzen bei der ViewEngine des erzeugten Controller den ViewLocator auf unseren eigenen ViewLocator. Nun fehlt nur noch der Code zum registrieren unser eigenen ControllerFactory. Dies erreicht man indem man in der Global.asax in der Methode Application_Start die neue ControllerFactory setzt:
protected void Application_Start()
{ RegisterRoutes(RouteTable.Routes);
// plug in our custom controller factory to replace the default view locator
ControllerBuilder.Current.SetControllerFactory(typeof(PPMControllerFactory));
}
Das wars 