2011-05-26 50 views
2

比方說,我有幾個像VeryLongNameController這樣的長名稱的控制器。更改ASP.NET MVC 3控制器路由行爲

默認情況下,ASP.NET MVC3會將〜/ VeryLongName或〜/ verylongname映射到此控制器。不過,我不喜歡在URL中使用大寫名稱,並且希望它映射所有長名稱的控制器,例如〜/ very-long-name。

我知道可以逐個添加自定義路由,但有沒有辦法改變默認行爲?

+0

出於好奇,什麼情況下將一個URI是像這樣離開,你要改變它呢? – 2011-05-26 14:55:25

+0

它只是主要用於化妝品,我希望URI不包含大寫字母,並且更具可讀性。即/ a-controller-with-long-name而不是/ AControllerWithLongName。我很好奇,如果有可能的話。 – 2011-05-26 14:59:32

+0

我在下面添加了一個答案 - 不幸的是,這隻適用於行動名稱 - 如果這有幫助 – 2011-05-26 15:09:03

回答

0

經調查多一點,並得到了它通過使自己的IHttpHandler和IRouteHandler,看着源System.Web.Mvc.MvcHandlerSystem.Web.Mvc.MvcRouteHandler基本上覆制和粘貼,替換它如何解決控制器名稱的工作。不過,我不喜歡這種方法,因爲它感覺重量太重,無法重做整個請求處理管道以進行簡單的整型任務。因此,我會爲每個控制器添加手動路由,這個控制器有兩個名字(沒有那麼多)。

更新:我已經有了一個更簡單的解決方案,並通過重寫ControllerFactory來完成。

public class ControllerFactory : DefaultControllerFactory 
{ 
    public override IController CreateController(RequestContext requestContext, 
     string controllerName) 
    { 
     requestContext.RouteData.Values["action"] = 
      requestContext.RouteData.Values["action"].ToString().Replace("-", ""); 
     return base.CreateController(requestContext, controllerName.Replace("-","")); 
    } 
} 

我的博客文章吧:http://cangencer.wordpress.com/2011/05/27/better-looking-urls-in-asp-net-mvc-3/

4

你可以,你需要提供自己的路由處理程序實現IRouterHandler,有一個很好的例子here

+0

謝謝,我會看看這個。 – 2011-05-26 14:56:52

0

您可以使用ActionName一個動作方法具體屬性..不是一個控制器,雖然

 

[ActionName("an-action-with-long-name")] 
public ActionResult AnActionWithLongName() { 
    // ... 
} 

而且 - 我更喜歡添加路線控制器/操作方法,所以我不創建任何意想不到的映射(我也單元測試它們) - 所以這是一件需要考慮的事情。

+0

實際上,這正是我想要避免的,不必爲每個控制器或操作單獨定義它。 :) – 2011-05-26 16:17:53