Asp.net mvc 如何在ASP.NET MVC中使用小写路由?
如何在ASP.NET MVC中使用小写加下划线的路由?这样我就可以调用Asp.net mvc 如何在ASP.NET MVC中使用小写路由?,asp.net-mvc,url,routes,case,Asp.net Mvc,Url,Routes,Case,如何在ASP.NET MVC中使用小写加下划线的路由?这样我就可以调用/dinners/details/2调用DinnersController.details(2),如果可能的话,调用/dinners/more\u details/2调用DinnersController.moredtails(2) 所有这些,同时仍然使用像{controller}/{action}/{id}这样的模式,这两个教程在我想做同样的事情并且工作良好时很有帮助: 编辑:对于具有区域的项目,需要修改GetVirtu
/dinners/details/2
调用DinnersController.details(2)
,如果可能的话,调用/dinners/more\u details/2
调用DinnersController.moredtails(2)
所有这些,同时仍然使用像
{controller}/{action}/{id}
这样的模式,这两个教程在我想做同样的事情并且工作良好时很有帮助:
编辑:对于具有区域的项目,需要修改GetVirtualPath()方法:
这实际上有两个答案:
下划线由您自己决定,不过…您可以使用ActionName属性吗
[ActionName("more_details")]
public ActionResult MoreDetails(int? page)
{
}
我认为这个案子无关紧要。URL中的更多详细信息、更多详细信息、更多详细信息都会将您带到同一个控制器操作。我在上找到了这个,但它没有关于如何实现LowercaseRoute
类的信息。因此,在此重新发布附加信息
首先将路由
类扩展为小写路由
public class LowercaseRoute : Route
{
public LowercaseRoute(string url, IRouteHandler routeHandler)
: base(url, routeHandler) { }
public LowercaseRoute(string url, RouteValueDictionary defaults, IRouteHandler routeHandler)
: base(url, defaults, routeHandler) { }
public LowercaseRoute(string url, RouteValueDictionary defaults, RouteValueDictionary constraints, IRouteHandler routeHandler)
: base(url, defaults, constraints, routeHandler) { }
public LowercaseRoute(string url, RouteValueDictionary defaults, RouteValueDictionary constraints, RouteValueDictionary dataTokens, IRouteHandler routeHandler) : base(url, defaults, constraints, dataTokens, routeHandler) { }
public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
{
VirtualPathData path = base.GetVirtualPath(requestContext, values);
if (path != null)
path.VirtualPath = path.VirtualPath.ToLowerInvariant();
return path;
}
}
然后修改Global.asax.cs的registerOutes
方法
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.Add(new LowercaseRoute("{controller}/{action}/{id}",
new RouteValueDictionary(new { controller = "Home", action = "Index", id = "" }),
new MvcRouteHandler()));
//routes.MapRoute(
// "Default", // Route name
// "{controller}/{action}/{id}", // URL with parameters
// new { controller = "Home", action = "Index", id = "" } // Parameter defaults
//);
}
但是,我想知道如何使用routes.MapRoute…如果您使用UrlHelper生成链接,只需将操作和控制器的名称指定为小写:
itemDelete.NavigateUrl = Url.Action("delete", "photos", new { key = item.Key });
结果为:/media/photos/delete/64(即使我的控制器和操作是pascal大小写)。您可以通过将此类添加为RouteCollection的扩展来继续使用MapRoute语法:
public static class RouteCollectionExtension
{
public static Route MapRouteLowerCase(this RouteCollection routes, string name, string url, object defaults)
{
return routes.MapRouteLowerCase(name, url, defaults, null);
}
public static Route MapRouteLowerCase(this RouteCollection routes, string name, string url, object defaults, object constraints)
{
Route route = new LowercaseRoute(url, new MvcRouteHandler())
{
Defaults = new RouteValueDictionary(defaults),
Constraints = new RouteValueDictionary(constraints)
};
routes.Add(name, route);
return route;
}
}
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.LowercaseUrls = true;
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
现在,您可以在应用程序启动时使用“MapRouteLowerCase”而不是“MapRoute”:
在System.Web.Routing 4.5中,您可以通过设置RouteCollection的LowercaseUrls属性来实现这一简单操作:
public static class RouteCollectionExtension
{
public static Route MapRouteLowerCase(this RouteCollection routes, string name, string url, object defaults)
{
return routes.MapRouteLowerCase(name, url, defaults, null);
}
public static Route MapRouteLowerCase(this RouteCollection routes, string name, string url, object defaults, object constraints)
{
Route route = new LowercaseRoute(url, new MvcRouteHandler())
{
Defaults = new RouteValueDictionary(defaults),
Constraints = new RouteValueDictionary(constraints)
};
routes.Add(name, route);
return route;
}
}
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.LowercaseUrls = true;
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
另外,假设您这样做是出于SEO原因,您希望将传入的URL重定向为小写(正如本文的许多链接所述)
如果您碰巧使用了ASP.NET Core,您可能应该看看: 将以下行添加到
Startup
类的ConfigureServices
方法中
services.AddRouting(options => options.LowercaseUrls = true);
我还没试过-它会让你用其中一个吗?(“moretails”或“more_details”)后续,我尝试了它,它要求您使用指定的名称,因此不,它不允许您以任何方式处理它。此外,根据您构建控制器操作和视图的方式,您可能需要显式指定视图的名称。由于各种原因,我最终还是手动编写了所有路由,我认为除了CRUD之外,很难避免这样做。所以我只是用小写字母写的。用网络表单?到这里:。(我正在逐渐将我的项目从web表单转换为MVC,并将两者都包含在项目中)我很确定你可以作为默认值来做这件事。我认为如果你用小写或大写输入路由并不重要。GONeale的文章提供了一种扩展方法,因此你可以编写
routes.maproteLowerCase(…
这比上面的更好:GONeale的整个博客消失了。内容相似(扩展方法相同)。它在减少重复内容的背景下解决了这种情况。GONeale链接已更改;URL现在为@Derek-Nope,教程在使用Area时会出现故障。经过3天的尝试,我找到了一个更好的解决方案,有一个名为属性路由的库。解决了问题,使生活更加轻松。对于mvc 4,有一个tter解决方案使用property routes.LowercaseUrls=true;有关@GONeale的更多信息您的URL发生了什么事?第二个链接现在已不存在了!但这让我笑了,标题是“互联网上最好的Ale站点”@chteuchteu那个链接对我来说不起作用,但确实起了作用。我认为在一个中心位置进行这项工作是最简单和最标准的解决方案。这和内联CSS一样糟糕。(显然有15个人使用内联CSS)。这对Linux服务器也是如此吗?这是4.0中迄今为止最简单的一件事。希望这是最好的…几乎需要很多代码!很好的答案:-)后一个SEO部分非常适合HTTP模块。@Aaron Sherman应用程序_BeginRequest部分被支持到哪里去了?当它在公共类RouteConfig内部时,以及当它在if外部时,都会给我带来错误。@richard mišenčck将它添加到Global.asax文件对于任何阅读本文的人来说,第一个cod中的LowercaseRoute
类上面的e代码段似乎来自Core2.0
services.AddRouting(options => options.LowercaseUrls = true);