Использование регулярных выражений в маршруте .NET MVC для обработки символов верхнего регистра - PullRequest
1 голос
/ 22 июля 2010

Я работаю над приложением .NET MVC и пытаюсь написать маршрут в global.asax.cs. Цель состоит в том, чтобы я хотел, чтобы любой URL, содержащий заглавные буквы, проходил по указанному маршруту. Идея заключается в том, что маршрутизатор будет нижний регистр URL-адреса и перенаправить его. Мой подход заключается в использовании регулярного выражения для обработки этого. Вот что у меня есть:

routes.MapRoute(
    "CanonicalizationRoute", 
    "{*url}", 
    new 
    { 
        controller = "CanonicalRouter", 
        action = "Reroute" 
    }, 
    new 
    { 
        url = @"[A-Z]+" 
    });

Кажется, что не получается ... есть мысли о том, как лучше всего справиться с этим?

Ответы [ 2 ]

0 голосов
/ 22 июля 2010

Если вы просто ищете поддержку строчных маршрутов (в основном делая ваши маршруты без учета регистра), вы можете проверить ниже.В настоящее время мы используем это, и оно отлично работает.

Во-первых, вам понадобится файл RouteExtensions.cs или имя, которое вам нравится, со следующим (совместимо с ASP.NET MVC RC1):

using System;
using System.Web.Mvc;
using System.Web.Routing;

namespace MyMvcApplication.App.Helpers
{
    public class LowercaseRoute : System.Web.Routing.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;
        }
    }

    public static class RouteCollectionExtensions
    {
        public static void MapRouteLowercase(this RouteCollection routes, string name, string url, object defaults)
        {
            routes.MapRouteLowercase(name, url, defaults, null);
        }

        public static void MapRouteLowercase(this RouteCollection routes, string name, string url, object defaults, object constraints)
        {
            if (routes == null)
                throw new ArgumentNullException("routes");

            if (url == null)
                throw new ArgumentNullException("url");

            var route = new LowercaseRoute(url, new MvcRouteHandler())
            {
                Defaults = new RouteValueDictionary(defaults),
                Constraints = new RouteValueDictionary(constraints)
            };

            if (String.IsNullOrEmpty(name))
                routes.Add(route);
            else
                routes.Add(name, route);
        }
    }
}

Затем используйте ссылку в вашем файле Global.asax.cs на вышеуказанный класс, и все готово для создания строчного маршрута.Ниже приведен пример строчного маршрута, и в любое время этот маршрут будет называться вашим URL в нижнем регистре.

        routes.MapRouteLowercase(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new {controller = "Home", action = "index", id = ""} // Parameter defaults
            );

и, при необходимости, если вы заинтересованы в преобразовании любого входящего URL-адреса в нижний регистр (вводимый пользователем вручнуюили вызываемые ссылки) вы можете использовать это в своем методе Application_BeginRequest () (помните, что это не нужно для самих строчных маршрутов, код выше будет обрабатывать это):

    protected void Application_BeginRequest(Object sender, EventArgs e)
    {
        // If upper case letters are found in the URL, redirect to lower case URL.
        // Was receiving undesirable results here as my QueryString was also being converted to lowercase.
        // You may want this, but I did not.
        //if (Regex.IsMatch(HttpContext.Current.Request.Url.ToString(), @"[A-Z]") == true)
        //{
        //    string LowercaseURL = HttpContext.Current.Request.Url.ToString().ToLower();

        //    Response.Clear();
        //    Response.Status = "301 Moved Permanently";
        //    Response.AddHeader("Location", LowercaseURL);
        //    Response.End();
        //}

        // If upper case letters are found in the URL, redirect to lower case URL (keep querystring the same).
        string lowercaseURL = (Request.Url.Scheme + "://" + HttpContext.Current.Request.Url.Authority + HttpContext.Current.Request.Url.AbsolutePath);
        if (Regex.IsMatch(lowercaseURL, @"[A-Z]"))
        {
            lowercaseURL = lowercaseURL.ToLower() + HttpContext.Current.Request.Url.Query;

            Response.Clear();
            Response.Status = "301 Moved Permanently";
            Response.AddHeader("Location", lowercaseURL);
            Response.End();
        }
    }

Ответ изначально пришел от this SO post.

Содержимое этого ответа взято из сообщения в блоге, которое больше недоступно, но его можно просмотреть на archive.org здесь .

0 голосов
/ 22 июля 2010

Случайно ли вы используете IIS 7?Модуль URL Rewrite обеспечивает хороший способ обработки этого за пределами вашего приложения (настроено в файле web.config). Вот сообщение в блоге об этом , включая ваши конкретные потребности.

Не проверено, но что касается вашей проблемы с кодом, может быть, регулярное выражение должно разрешать символы помимо заглавных букв?"* [AZ] +. *"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...