如何在不创建新路由的情况下为控制器设置自定义URL路径?

时间:2011-08-04 21:55:39

标签: asp.net-mvc-3 razor

我想知道是否有属性(内置或一些开源)让我用我希望它使用的特定URL段标记我的控制器,如:

[MagicUrlRoute("status")]
public class InternalNameNotToBeRevealed : Controller
{
    public ActionResult Show()
    {
    ...
    }
}

这样,用户看到的不是“/ InternalNameNotToBeRevealed / Show”,而是“/ status / Show”。这可能是挑剔,但我不得不使用控制器类名作为官方URL路径。

现在,我知道我可以在global.asax上创建一个自定义路由,但这对于数百个控制器来说将是很多工作。

我发现这个非常方便的库可以做到这一点,但仅限于操作: http://maproutes.codeplex.com/releases/view/39888

我感谢任何建议。

1 个答案:

答案 0 :(得分:2)

您可以有一个映射列表,只需在循环中调用MapRoute即可注册所有自定义映射。映射可以是字典,或者您甚至可以在App_Start上扫描所有控制器,收集自定义属性值,然后使用它们构建映射。但是,我不确定它对大量映射的性能有多好。

如果您想要更高性能的机制,则必须创建自己的路由。您应该能够通过继承System.Web.Routing.RouteBase并重载GetRouteData和GetVirtualPath来执行此操作。构造RouteData时,您可以只提供现有的System.Web.Mvc.MvcRouteHandler作为路由处理程序,只要您的路由数据包含“controller”和“action”值,它就应该继续沿着MVC管道行进。然后只需使用RouteCollection上的Add方法添加路由。您可以在System.Web.Mvc.RouteCollectionExtensions中查看MapRoute,了解MVC如何添加路径。