正在更改ASP.NET MVC 3控制器的路由行为

本文关键字:控制器 路由 MVC ASP NET | 更新日期: 2023-09-27 17:57:40

假设我有一些长名称的控制器,如VeryLongNameController。

默认情况下,ASP.NET MVC3将~/VeryLongName或~/VeryLongName映射到此控制器。然而,我不喜欢在URL中使用大写名称,而是希望它映射所有长名称的控制器,如~/超长名称。

我知道可以一个接一个地添加自定义路由,但有办法改变默认行为吗?

正在更改ASP.NET MVC 3控制器的路由行为

您可以,您需要提供自己的实现IRouterHandler的路由处理程序,这里有一个很好的例子。

您可以专门为操作方法使用ActionName属性。。不是的控制器

[ActionName("具有长名称的操作")]public ActionResult AnActionWithLongName(){//。。。}

此外,我更喜欢为每个控制器/操作方法添加一个路由,这样我就不会创建任何意外的映射(我也会对它们进行单元测试),所以这是一件需要考虑的事情。

我对此进行了更多的研究,并通过制作自己的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/