2010-01-23 32 views

回答

3

只要您知道框架的運作方式,大多數約定都是可延展的。讓我們來解決兩個最大的約定:

  1. 的「{控制器}/{行動} /」 magic關鍵字在控制器首先從路由實例控制器

  2. 方式的框架搜索瀏覽目錄,然後在Shared目錄中。

默認情況下,您創建的每條路徑都與一個MvcRouteHandler對象的實例關聯。當路由匹配時,調用該處理程序來處理傳入的請求。以下是MvcHandler的ProcessRequest外觀:

protected internal virtual void ProcessRequest(HttpContextBase httpContext) 
{ 
    this.AddVersionHeader(httpContext); 
    string requiredString = this.RequestContext.RouteData.GetRequiredString("controller"); 
    IControllerFactory controllerFactory = this.ControllerBuilder.GetControllerFactory(); 
    IController controller = controllerFactory.CreateController(this.RequestContext, requiredString); 
    if (controller == null) 
    { 
     throw new InvalidOperationException(string.Format(CultureInfo.CurrentUICulture, MvcResources.ControllerBuilder_FactoryReturnedNull, new object[] { controllerFactory.GetType(), requiredString })); 
    } 
    try 
    { 
     controller.Execute(this.RequestContext); 
    } 
    finally 
    { 
     controllerFactory.ReleaseController(controller); 
    } 
} 

注意硬編碼字符串「controller」。那麼,如果你想編寫你自己的控制器查找邏輯,你可以用你想要的任何路線代替這個處理程序。簡單地做something like this (shameless blog plug):現在

routes.Add("ImagesRoute", 
       new Route("graphics/{filename}", new ImageRouteHandler())); 

當路由匹配,它調用自己的邏輯,你可以做任何你請。順便說一下,用於查找帶有「Controller」後綴的XXXXController類的反射是DefaultControllerFactory對象的一部分,在上面的處理程序中調用,並且此工廠是可替換的。

因此,控制器挑選是一個可覆蓋的約定。從任何控制器方法執行「return View()」時,如何查找視圖?那麼這裏是爲WebFormViewEngine構造,框架的默認視圖引擎:

public WebFormViewEngine() 
{ 
    base.MasterLocationFormats = new string[] { "~/Views/{1}/{0}.master", "~/Views/Shared/{0}.master" }; 
    base.ViewLocationFormats = new string[] { "~/Views/{1}/{0}.aspx", "~/Views/{1}/{0}.ascx", "~/Views/Shared/{0}.aspx", "~/Views/Shared/{0}.ascx" }; 
    base.PartialViewLocationFormats = base.ViewLocationFormats; 
} 

所以,如果你不喜歡的看在控制器目錄的約定,然後分享的 - 你可以輕鬆地擴展WebFormViewEngine(或use an entirely different view engine)和放下它在你的Global.asax:

ViewEngines.Engines.Add(new MyViewEngine()); 

一個關於MVC框架令人驚奇的事情是不是真的是多麼靈活。你可以用你自己的邏輯來替換它的幾乎任何部分 - 並且所有的代碼都可以看到他們做了什麼。