Маршруты MVC3 - как разделить после последней черты в URL? - PullRequest
0 голосов
/ 24 октября 2011

С учетом следующих маршрутов:

        routes.MapRoute(name: "CityHomePage1", url: "{city}-{state}", defaults: new { controller = "Home", action = "GeoHomePage" });
        routes.MapRoute(name: "CityHomePage2", url: "{city}-{state}/", defaults: new { controller = "Home", action = "GeoHomePage" });
        routes.MapRoute(name: "CityStateResults", url: "{city}-{state}/{searchTerm}", defaults: new { controller = "Results", action = "SearchCityState" });
        routes.MapRoute(name: "CityStateCategoryResults", url: "{city}-{state}/{category}/{searchTerm}", defaults: new { controller = "Results", action = "SearchCityStateCategory" });

Это хорошо работает, когда в городах нет тире ("-"), однако теперь я изменяю способ отображения нескольких городов в URL-адресе с подчеркивания между ними до теперь тире.

Таким образом, если URL-адрес читается как http://www.site.com/Gardena-Ceretos-Santa_Monica-California/someterm, маршруты больше не будут работать.

Как бы я взял состояние как все после последнего "-" и перед "/" в моих маршрутах, чтобы извлечь состояние?

Глядя на это сейчас, я должен был структурировать URL-адреса как / city-city-city / state / searchtearm, но сейчас я должен придерживаться текущей структуры.

Спасибо.

1 Ответ

0 голосов
/ 24 октября 2011

Это ситуация, когда у маршрутизации нет никаких инструментов, которые могли бы вам помочь. Есть два варианта.

Сначала измените свой токен на {cityState}, задайте этот параметр в ваших методах действия и проанализируйте строку cityState в ваших действиях контроллера.

Во-вторых, измените свой токен на {cityState} (обещаю, это другой вариант), а затем используйте пользовательский RouteHandler для разбора строки cityState и добавьте токены города и штата для передачи в ваши существующие действия. RouteHandler будет выглядеть так:

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

public class MyRouteHandler : IRouteHandler   
{   
    public IHttpHandler GetHttpHandler(RequestContext requestContext)   
    {   
        var routeData = requestContext.RouteData;   
        var cityState = routeData.Values["cityState"].ToString();
        var parts = cityState.Split(new string[] { "-" }, StringSplitOptions.RemoveEmptyEntries);
        var state = parts.Last();
        var citySb = new StringBuilder();
        foreach (var part in parts)
        {
            if (part != state)
            {
                if (citySb.Length > 0)
                    citySb.Append("-");
                citySb.Append(part);
            }
        }
        routeData.Values.Add("city", citySb.ToString());
        routeData.Values.Add("state", state);
        var handler = new MvcHandler(requestContext);   
        return handler;   
    }   
}

Затем измените каждый из ваших маршрутов, чтобы он был похож на это:

routes.MapRoute(
    "CityHomePage1", 
    new Route(
        "{cityState}",   
        new RouteValueDictionary(   
            new { controller = "Home", action = "GeoHomePage" }),   
            new MyRouteHandler()  
        )
    )  
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...