Asp.Net MVC:如何在我的网址中启用短划线?

时间:2008-08-27 14:41:31

标签: asp.net-mvc

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

/MyController/MyAction

我想:

/My-Controller/My-Action

这可能吗?

9 个答案:

答案 0 :(得分:150)

您可以像这样使用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

答案 1 :(得分:15)

您可以创建自定义路由处理程序,如以下博客所示:

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 support for URL's with hyphens

答案 2 :(得分:11)

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

大写网址存在问题,因为Cookie路径区分大小写,大多数互联网实际上区分大小写,而Microsoft技术将网址视为不区分大小写。 (More on my blog post

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

要安装它,只需在Visual Studio中打开NuGet窗口,右键单击Project并选择NuGet Package Manager,然后在“Online”选项卡上键入“Lowercase Dashed Route”,它就会弹出。

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

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()
  )
);

就是这样。所有网址都是小写,虚线和隐式转换,而不需要你做更多的事情。

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

答案 3 :(得分:7)

这是我使用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
    }
}

如果在本地计算机上进行测试,则显示在浏览器中的URL为: localhost / sample-area / my-action 。您无需重命名视图文件或任何内容。我对最终结果非常满意。

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

article帮助我得出了这个结论。我希望它对你有用。

答案 4 :(得分:3)

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的项目获得此行为,可以在AttributeRouting project(也是available as a nuget)中找到类似的功能。事实上,微软与AttributeRouting的作者联系,以帮助他们实现MVC 5。

答案 5 :(得分:1)

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

这不应该太难。

答案 6 :(得分:1)

您可以定义特定路线,例如:

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

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

答案 7 :(得分:0)

如果您有权访问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,然后就不需要编写自定义处理程序或其他任何东西了。访问者可以获得漂亮的网址,并获得MVC可以理解的内容。

以下是一个控制器和操作的示例,但您可以将其修改为更通用的解决方案:

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

可能的缺点是你必须将项目切换为使用IIS Express或IIS重写才能在开发过程中工作。

答案 8 :(得分:0)

我对MVC还很陌生,所以请耐心等待。它不是一个优雅的,全能的解决方案,但在MVC4中为我做了诀窍:

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