Asp.Net MVC:如何在我的url中启用破折号?

我想在我的url中使用破折号分隔单词。 所以,而不是:

/MyController/MyAction 

我想要:

 /My-Controller/My-Action 

这可能吗?

你可以像这样使用ActionName属性:

 [ActionName("My-Action")] public ActionResult MyAction() { return View(); } 

请注意,您将需要调用您的视图文件“My-Action.cshtml”(或适当的扩展名)。 您还需要在任何Html.ActionLink方法中引用“my-action”。

控制器没有这样简单的解决scheme。

编辑:更新MVC5

现在使用MVC5,属性路由已经被吸收到了项目中。 你现在可以使用:

 [Route("My-Action")] 

行动方法。

对于控制器,您可以应用RoutePrefix属性,该属性将应用于该控制器中的所有操作方法:

 [RoutePrefix("my-controller")] 

使用RoutePrefix的好处之一是URL参数也将传递给任何操作方法。

 [RoutePrefix("clients/{clientId:int}")] public class ClientsController : Controller ..... 

剪断..

 [Route("edit-client")] public ActionResult Edit(int clientId) // will match /clients/123/edit-client 

您可以创build一个自定义路由处理程序,如本博客所示:

http://blog.didsburydesign.com/2010/02/how-to-allow-hyphens-in-urls-using-asp-net-mvc-2/

 public class HyphenatedRouteHandler : MvcRouteHandler{ protected override IHttpHandler GetHttpHandler(RequestContext requestContext) { requestContext.RouteData.Values["controller"] = requestContext.RouteData.Values["controller"].ToString().Replace("-", "_"); requestContext.RouteData.Values["action"] = requestContext.RouteData.Values["action"].ToString().Replace("-", "_"); return base.GetHttpHandler(requestContext); } } 

…和新的路线:

 routes.Add( new Route("{controller}/{action}/{id}", new RouteValueDictionary( new { controller = "Default", action = "Index", id = "" }), new HyphenatedRouteHandler()) ); 

这里提出了一个非常类似的问题: ASP.net MVC支持连字符的URL

我为这个问题开发了一个开源的NuGet库 ,它隐式地把EveryMvc / Url转换为每个mvc / url。

大写的url是有问题的,因为Cookiepath是区分大小写的,大多数互联网实际上是区分大小写的,而微软技术则将大小写不区分大小写。 ( 更多关于我的博客文章 )

NuGet套餐: https : //www.nuget.org/packages/LowercaseDashedRoute/

要安装它,只需在Visual Studio中打开NuGet窗口,方法是右键单击Project并selectNuGet Package Manager,在“Online”选项卡上键入“小写Dashed Route”,然后popup。

或者,您可以在程序包pipe理器控制台中运行此代码

Install-Package LowercaseDashedRoute

之后,你应该打开App_Start / RouteConfig.cs并注释掉现有的route.MapRoute(…)调用并添加它:

 routes.Add(new LowercaseDashedRoute("{controller}/{action}/{id}", new RouteValueDictionary( new { controller = "Home", action = "Index", id = UrlParameter.Optional }), new DashedRouteHandler() ) ); 

而已。 所有的url都是小写字母,虚线,并隐含转换,而不需要做更多的事情。

开源项目url: https : //github.com/AtaS/lowercase-dashed-route

以下是我在ASP.NET MVC 5中使用过的区域,它的工作非常有吸引力。 我也不必重新命名我的观点。

在RouteConfig.cs中,执行以下操作:

  public static void RegisterRoutes(RouteCollection routes) { // add these to enable attribute routing and lowercase urls, if desired routes.MapMvcAttributeRoutes(); routes.LowercaseUrls = true; // routes.MapRoute... } 

在你的控制器中,在你的类定义之前添加:

 [RouteArea("SampleArea", AreaPrefix = "sample-area")] [Route("{action}")] public class SampleAreaController: Controller { // ... [Route("my-action")] public ViewResult MyAction() { // do something useful } } 

在本地机器上testing的浏览器中显示的URL是: localhost / sample-area / my-action 。 你不需要重命名你的视图文件或任何东西。 我对最终的结果很满意。

启用路由属性后,您可以删除任何区域注册文件,例如SampleAreaRegistration.cs。

这篇文章帮助我得出这个结论。 我希望这对你有用。

Asp.Net MVC 5将支持属性路由,允许更多的显式控制路由名称。 示例用法如下所示:

 [RoutePrefix("dogs-and-cats")] public class DogsAndCatsController : Controller { [HttpGet("living-together")] public ViewResult LivingTogether() { ... } [HttpPost("mass-hysteria")] public ViewResult MassHysteria() { } } 

为了在v5之前使用Asp.Net MVC的项目获得这种行为,类似的function可以通过AttributeRouting项目 (也可以作为nuget )来find。 事实上,微软向AttributeRouting的作者伸出援手,帮助他们实现MVC 5。

您可以编写一个从Route类GetRouteData派生的自定义路由来去除破折号,但是当您调用API来生成一个URL时,您必须记住包含破折号来表示操作名称和控制器名称。

这不应该太难。

您可以定义一个特定的路线,如:

 routes.MapRoute( "TandC", // Route controllerName "CommonPath/{controller}/Terms-and-Conditions", // URL with parameters new { controller = "Home", action = "Terms_and_Conditions" } // Parameter defaults ); 

但是这条路线必须您的默认路线之前注册。

如果您有权访问IIS URL重写模块( http://blogs.iis.net/ruslany/archive/2009/04/08/10-url-rewriting-tips-and-tricks.aspx ),则可以简单地重写url。

可以将/ my-controller / my-action的请求重写为/ mycontroller / myaction,然后不需要编写自定义处理程序或其他任何东西。 访客得到漂亮的url,你得到的MVC可以理解。

下面是一个控制器和操作的例子,但是你可以修改这个更通用的解决scheme:

 <rewrite> <rules> <rule name="Dashes, damnit"> <match url="^my-controller(.*)" /> <action type="Rewrite" url="MyController/Index{R:1}" /> </rule> </rules> </rewrite> 

可能的缺点是,您将不得不将项目切换为使用IIS Express或IIS进行重写,以便在开发过程中正常工作。

我对MVC来说还是很新的,所以拿一粒盐来吧。 这不是一个优雅的,全面的解决scheme,但在MVC4中为我做了窍门:

 routes.MapRoute( name: "ControllerName", url: "Controller-Name/{action}/{id}", defaults: new { controller = "ControllerName", action = "Index", id = UrlParameter.Optional } );