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的支持