比方說,我有幾個像VeryLongNameController這樣的長名稱的控制器。更改ASP.NET MVC 3控制器路由行爲
默認情況下,ASP.NET MVC3會將〜/ VeryLongName或〜/ verylongname映射到此控制器。不過,我不喜歡在URL中使用大寫名稱,並且希望它映射所有長名稱的控制器,例如〜/ very-long-name。
我知道可以逐個添加自定義路由,但有沒有辦法改變默認行爲?
比方說,我有幾個像VeryLongNameController這樣的長名稱的控制器。更改ASP.NET MVC 3控制器路由行爲
默認情況下,ASP.NET MVC3會將〜/ VeryLongName或〜/ verylongname映射到此控制器。不過,我不喜歡在URL中使用大寫名稱,並且希望它映射所有長名稱的控制器,例如〜/ very-long-name。
我知道可以逐個添加自定義路由,但有沒有辦法改變默認行爲?
經調查多一點,並得到了它通過使自己的IHttpHandler和IRouteHandler,看着源System.Web.Mvc.MvcHandler和System.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/
您可以使用ActionName一個動作方法具體屬性..不是一個控制器,雖然
[ActionName("an-action-with-long-name")] public ActionResult AnActionWithLongName() { // ... }
而且 - 我更喜歡添加路線每控制器/操作方法,所以我不創建任何意想不到的映射(我也單元測試它們) - 所以這是一件需要考慮的事情。
實際上,這正是我想要避免的,不必爲每個控制器或操作單獨定義它。 :) – 2011-05-26 16:17:53
出於好奇,什麼情況下將一個URI是像這樣離開,你要改變它呢? – 2011-05-26 14:55:25
它只是主要用於化妝品,我希望URI不包含大寫字母,並且更具可讀性。即/ a-controller-with-long-name而不是/ AControllerWithLongName。我很好奇,如果有可能的話。 – 2011-05-26 14:59:32
我在下面添加了一個答案 - 不幸的是,這隻適用於行動名稱 - 如果這有幫助 – 2011-05-26 15:09:03