Asp.Net MVC:如何在网址中启用破折号?
时间:2020-03-05 18:43:53 来源:igfitidea点击:
我想在网址中使用破折号来分隔单词。因此,而不是:
/MyController/MyAction
我想要:
/My-Controller/My-Action
这可能吗?
解决方案
回答
我们可以编写从Route类GetRouteData派生的自定义路由来删除破折号,但是当调用API生成URL时,我们必须记住要在动作名称和控制器名称中包含破折号。
那不应该太难。
回答
我们可以像这样使用ActionName属性:
[ActionName("My-Action")] public ActionResult MyAction() { return View(); }
请注意,然后我们需要将View文件称为" My-Action.cshtml"(或者适当的扩展名)。我们还需要在任何Html.ActionLink方法中引用" my-action"。
对于控制器,没有这么简单的解决方案。
编辑:MVC5的更新
全局启用路由:
public static void RegisterRoutes(RouteCollection routes) { routes.MapMvcAttributeRoutes(); // routes.MapRoute... }
现在使用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
回答
我们可以创建一个自定义路由处理程序,如本博客所示:
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的支持