Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 如何在ASP.NET MVC中使用小写路由?_Asp.net Mvc_Url_Routes_Case - Fatal编程技术网

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

如何在ASP.NET MVC中使用小写加下划线的路由?这样我就可以调用
/dinners/details/2
调用
DinnersController.details(2)
,如果可能的话,调用
/dinners/more\u details/2
调用
DinnersController.moredtails(2)


所有这些,同时仍然使用像
{controller}/{action}/{id}
这样的模式,这两个教程在我想做同样的事情并且工作良好时很有帮助:

编辑:对于具有区域的项目,需要修改GetVirtualPath()方法:


这实际上有两个答案:

  • 您已经可以这样做了:路由引擎执行不区分大小写的比较。如果键入小写路由,它将路由到相应的控制器和操作
  • 如果您使用生成路由链接的控件(ActionLink、RouteLink等),除非您覆盖此默认行为,否则它们将生成混合大小写链接

  • 下划线由您自己决定,不过…

    您可以使用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);