我希望在我的 URL 中使用破折号分隔单词。所以代替:
我想:
1
| /My-Controller/My-Action |
这可能吗?
您可以像这样使用 ActionName 属性:
1 2 3 4
| [ActionName("My-Action")]
public ActionResult MyAction() {
return View();
} |
请注意,您需要将视图文件称为"My-Action.cshtml"(或适当的扩展名)。您还需要在任何 Html.ActionLink 方法中引用"my-action"。
控制器没有这么简单的解决方案。
编辑:MVC5 更新
全局启用路由:
1 2 3 4 5
| public static void RegisterRoutes(RouteCollection routes)
{
routes.MapMvcAttributeRoutes();
// routes.MapRoute...
} |
现在使用 MVC5,属性路由已被吸收到项目中。您现在可以使用:
关于操作方法。
对于控制器,您可以应用 RoutePrefix 属性,该属性将应用于该控制器中的所有操作方法:
1
| [RoutePrefix("my-controller")] |
使用 RoutePrefix 的好处之一是 URL 参数也可以传递给任何操作方法。
1 2
| [RoutePrefix("clients/{clientId:int}")]
public class ClientsController : Controller ..... |
剪断..
1 2
| [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/
1 2 3 4 5 6 7 8
| 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);
}
} |
...以及新路线:
1 2 3 4 5 6
| 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
我为这个问题开发了一个开源 NuGet 库,它隐式地将 EveryMvc/Url 转换为 every-mvc/url。
大写 url 是有问题的,因为 cookie 路径区分大小写,大多数互联网实际上是区分大小写的,而 Microsoft 技术将 url 视为不区分大小写。 (更多关于我的博文)
NuGet 包:https://www.nuget.org/packages/LowercaseDashedRoute/
要安装它,只需在 Visual Studio 中打开 NuGet 窗口,方法是右键单击项目并选择 NuGet 包管理器,然后在"在线"选项卡上键入"小写虚线",它应该会弹出。
或者,您可以在包管理器控制台中运行此代码:
Install-Package LowercaseDashedRoute
之后,您应该打开 App_Start/RouteConfig.cs 并注释掉现有的 route.MapRoute(...) 调用并添加它:
1 2 3 4 5 6
| 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 中,执行以下操作:
1 2 3 4 5 6 7 8
| public static void RegisterRoutes(RouteCollection routes)
{
// add these to enable attribute routing and lowercase urls, if desired
routes.MapMvcAttributeRoutes();
routes.LowercaseUrls = true;
// routes.MapRoute...
} |
在你的控制器中,在你的类定义之前添加这个:
1 2 3 4 5 6 7 8 9 10 11 12
| [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。
这篇文章帮助我得出了这个结论。希望对你有用。
Asp.Net MVC 5 将支持属性路由,允许更明确地控制路由名称。示例用法如下所示:
1 2 3 4 5 6 7 8 9
| [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 项目中找到类似的功能(也可作为 nuget 使用)。事实上,Microsoft 联系了 AttributeRouting 的作者,以帮助他们实现 MVC 5。
你可以定义一个特定的路由如:
1 2 3 4 5 6 7 8
| routes.MapRoute(
"TandC", // Route controllerName
"CommonPath/{controller}/Terms-and-Conditions", // URL with parameters
new {
controller ="Home",
action ="Terms_and_Conditions"
} // Parameter defaults
); |
但是这个路由必须在你的默认路由之前注册。
您可以编写一个从 Route 类 GetRouteData 派生的自定义路由来去除破折号,但是当您调用 API 来生成 URL 时,您必须记住将破折号包含在操作名称和控制器名称中。
这应该不会太难。
我对 MVC 还是很陌生,所以对它持保留态度。这不是一个优雅的、包罗万象的解决方案,但在 MVC4 中为我做了诀窍:
1 2 3 4 5
| routes.MapRoute(
name:"ControllerName",
url:"Controller-Name/{action}/{id}",
defaults: new { controller ="ControllerName", action ="Index", id = UrlParameter.Optional }
); |
如果您有权访问 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 可以理解的。
这是一个控制器和动作的示例,但您可以将其修改为更通用的解决方案:
1 2 3 4 5 6 7 8
| rewrite
rules
rule name="Dashes, damnit"
match url="^my-controller(.*)" /
action type="Rewrite" url="MyController/Index{R:1}" /
/rule
/rules
/rewrite |
这样做的可能缺点是您必须将项目切换为使用 IIS Express 或 IIS 以便在开发期间进行重写。