问题描述
|
假设我有一些带有长名称的控制器,例如VeryLongNameController。
默认情况下,ASP.NET MVC3将〜/ VeryLongName或〜/ verylongname映射到此控制器。但是,我不喜欢在URL中使用大写字母,而是希望它映射所有长名称的控制器,例如〜/ very-long-name。
我知道可以一一添加自定义路由,但是有没有办法更改默认行为?
解决方法
您可以,您需要提供实现route0ѭ的自己的路由处理程序,这里有一个很好的例子。
,您可以为操作方法专门使用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/