首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在ASP.NET MVC中使用小写路由?

如何在ASP.NET MVC中使用小写路由?
EN

Stack Overflow用户
提问于 2009-05-18 16:30:31
回答 6查看 55.4K关注 0票数 154

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

所有这些,同时仍然使用像{controller}/{action}/{id}这样的模式。

EN

回答 6

Stack Overflow用户

发布于 2012-07-25 18:02:43

在System.Web.Routing 4.5中,您可以通过设置RouteCollection的LowercaseUrls属性来实现这一点:

代码语言:javascript
复制
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原因,您希望将传入的urls重定向为小写(如本文中的许多链接所述)。

代码语言:javascript
复制
protected void Application_BeginRequest(object sender, EventArgs e)
    {
        //You don't want to redirect on posts, or images/css/js
        bool isGet = HttpContext.Current.Request.RequestType.ToLowerInvariant().Contains("get");
        if (isGet && !HttpContext.Current.Request.Url.AbsolutePath.Contains("."))
        {
            //You don't want to modify URL encoded chars (ex.: %C3%8D that's code to Í accented I) to lowercase, than you need do decode the URL
            string urlLowercase = Request.Url.Scheme + "://" + HttpUtility.UrlDecode(HttpContext.Current.Request.Url.Authority + HttpContext.Current.Request.Url.AbsolutePath);
            //You want to consider accented chars in uppercase check
            if (Regex.IsMatch(urlLowercase, @"[A-Z]") || Regex.IsMatch(urlLowercase, @"[ÀÈÌÒÙÁÉÍÓÚÂÊÎÔÛÃÕÄËÏÖÜÝÑ]"))
            {
                //You don't want to change casing on query strings
                urlLowercase = urlLowercase.ToLower() + HttpContext.Current.Request.Url.Query;

                Response.Clear();
                Response.Status = "301 Moved Permanently";
                Response.AddHeader("Location", urlLowercase);
                Response.End();
            }
        }
    }
票数 253
EN

Stack Overflow用户

发布于 2009-05-18 16:39:14

当我想做同样的事情并且工作良好时,这两个教程对我很有帮助:

http://www.coderjournal.com/2008/03/force-mvc-route-url-lowercase/ http://goneale.com/2008/12/19/lowercase-route-urls-in-aspnet-mvc/

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

代码语言:javascript
复制
public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
{
  var lowerCaseValues = new RouteValueDictionary();

  foreach (var v in values)
  {
    switch (v.Key.ToUpperInvariant())
    {
      case "ACTION":
      case "AREA":
      case "CONTROLLER":
        lowerCaseValues.Add(v.Key, ((string)v.Value).ToLowerInvariant());
        break;
      default:
        lowerCaseValues.Add(v.Key.ToLowerInvariant(), v.Value);
        break;
    }
  }
  return base.GetVirtualPath(requestContext, lowerCaseValues);
}
票数 44
EN

Stack Overflow用户

发布于 2009-11-14 04:21:08

如果您使用UrlHelper生成链接,您可以简单地将操作和控制器的名称指定为小写:

代码语言:javascript
复制
itemDelete.NavigateUrl = Url.Action("delete", "photos", new { key = item.Key });

结果是: /media/photos/delete/64 (即使我的控制器和action是pascal大小写)。

票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/878578

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档