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

/MyController/MyAction

我想要:

/My-Controller/My-Action

这可能吗?

有帮助吗?

解决方案

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

[ActionName("My-Action")]
public ActionResult MyAction() {
    return 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

我开发了一个开源的 NuGet 库 对于这个问题,它隐式地将 EveryMvc/Url 转换为 every-mvc/url。

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

NuGet 包: https://www.nuget.org/packages/LowercaseDashedRoute/

要安装它,只需右键单击项目并选择 NuGet 包管理器,在 Visual Studio 中打开 NuGet 窗口,然后在“在线”选项卡上键入“小写虚线路由”,它就会弹出。

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

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 均为小写、虚线,并且隐式转换,无需您执行任何其他操作。

开源项目网址: 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
    }
}

如果在本地计算机上测试,则浏览器中显示的 URL 为: 本地主机/样本区域/我的操作. 。您不需要重命名视图文件或其他任何内容。我对最终结果非常满意。

启用路由属性后,您可以删除任何区域注册文件,例如 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 的项目获得此行为,可以使用以下命令找到类似的功能 属性路由项目 (还 以 nuget 形式提供)。事实上,Microsoft 联系了 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 可以理解的 URL。

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

<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 还很陌生,所以对此持保留态度。这不是一个优雅的、包罗万象的解决方案,但在 MVC4 中为我解决了这个问题:

routes.MapRoute(
    name: "ControllerName",
    url: "Controller-Name/{action}/{id}",
    defaults: new { controller = "ControllerName", action = "Index", id = UrlParameter.Optional }
);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top