Оптимизация маршрутизации - PullRequest
0 голосов
/ 14 сентября 2011

Я сейчас работаю над маршрутизацией, чтобы было легче прочитать URL-адрес в адресной строке.

Например, если основной URL-адрес: ... / Affaire / SearchAffaires? OnlyFavorite = True

Я добавил маршрут ниже:

routes.MapRoute(
    "Search Affaire Only Favorite", // Route name
    "Affaire/SearchAffaires/OnlyFavorite", // URL with parameters
    new { controller = "Affaire",
         action = "SearchAffaires",
         OnlyFavorite = true } // Parameter defaults
);

URL теперь отображается так: ... / Affaire / SearchAffaires / OnlyFavorite

Пока все хорошо для меня.

Другой пример, если основной URL-адрес: ... / Affaire / SearchAffaires? IdStatus = 1

Со следующей таблицей состояния:

1 = Открыть / 2 = Закрыть / 3 = Отменено

Как получить URL-адрес, подобный следующему: ... / Affaire / SearchAffaires / Open ?

1 Ответ

1 голос
/ 17 сентября 2011

Вы можете написать собственный маршрут:

public class SearchRoute : Route
{
    public SearchRoute()
        : base(
            "Affaire/SearchAffaires/{searchToken}",
            new RouteValueDictionary(new { controller = "Affaire", action = "SearchAffaires" }),
            new MvcRouteHandler()
        )
    { }

    public override RouteData GetRouteData(HttpContextBase httpContext)
    {
        var rd = base.GetRouteData(httpContext);
        if (rd == null)
        {
            return null;
        }
        var searchToken = rd.Values["searchToken"] as string;
        if (string.IsNullOrEmpty(searchToken))
        {
            return rd;
        }

        if (string.Equals("OnlyFavorite", searchToken, StringComparison.OrdinalIgnoreCase))
        {
            rd.Values["onlyFavorite"] = true;
        }

        var statuses = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase)
        {
            { "open", "1" },
            { "close", "2" },
            { "cancelled", "3" },
        };

        string idStatus;
        if (statuses.TryGetValue(searchToken, out idStatus))
        {
            rd.Values["idStatus"] = idStatus;
        }

        return rd;
    }
}

, который вы бы зарегистрировали следующим образом:

routes.Add("Search Affaires", new SearchRoute());

Вот как это будет работать:

  • Affaire/SearchAffaires/OnlyFavorite перенаправит на действие SearchAffaires контроллера Affaire и передаст аргумент onlyFavorite=true.
  • Affaire/SearchAffaires/open перенаправит на действие SearchAffaires контроллера Affaire и будетпередал idStatus=1 аргумент.То же самое для close и cancelled.
  • . Любые другие шаблоны URL будут игнорироваться этим маршрутом
...