У меня проблемы с поиском подходящих маршрутов.
Я использую int в кодировке base-32 в качестве коротких ссылок на слайд-шоу в веб-приложении. Есть 5 разных версий каждого слайд-шоу, и я использую начальное письмо, чтобы различать каждую версию.
Маршруты всегда совпадают, за исключением случаев, когда первый символ в base-32 в кодировке int совпадает с символом, обозначающим версию слайд-шоу. Эта аномалия существует для всех 5 букв префикса: n, f, c, x и h.
Что из-за первых двух одинаковых символов эти маршруты не совпадают? Я затрудняюсь понять, что здесь происходит (когда маршруты не совпадают, они просто переходят к значениям по умолчанию).
Маршрутные совпадения (/na0
):
![route for na0](https://i.stack.imgur.com/kyLlj.png)
Маршрут не соответствует (/nn0
):
![route for nn0](https://i.stack.imgur.com/snTEm.png)
Маршрутные совпадения (/nfg
):
![route for nfg](https://i.stack.imgur.com/MAdIC.png)
Маршрут не соответствует (/ffg
):
![route for ffg](https://i.stack.imgur.com/mD7cF.png)
Я ошеломлен. Вот код маршрутизации, если он не понятен в таблицах RouteDebug на скриншотах:
routes.MapRoute(
"NonBrandedSlideshow",
"n{id}",
MVC.Slideshow.NonBranded(), null,
new { id = Settings.Base32Regex }
);
routes.MapRoute(
"FullSlideshow",
"f{id}",
MVC.Slideshow.Full(), null,
new { id = Settings.Base32Regex }
);
routes.MapRoute(
"CompactSlideshow",
"c{id}",
MVC.Slideshow.Compact(), null,
new { id = Settings.Base32Regex }
);
routes.MapRoute(
"FlexibleSlideshow",
"x{id}",
MVC.Slideshow.Flexible(), null,
new { id = Settings.Base32Regex }
);
routes.MapRoute(
"Html5Slideshow",
"h{id}",
MVC.Slideshow.NonBrandedHtml5(), null,
new { id = Settings.Base32Regex }
);
Здесь следует отметить, что я использую T4MVC (см. Раздел 2.2.5), и эти MapRoute
методы являются расширениями, добавленными T4MVC. Методы MapRoute
, которые я использую, эквивалентны стандартным методам, и я попытался использовать метод не-T4MVC MapRoute
с тем же результатом:
routes.MapRoute(
"Html5Slideshow",
"h{id}",
new { controller = "Slideshow", action = "NonBrandedHtml5" },
new { id = Settings.Base32Regex }
);
Вот Base32Regex, хотя я пробовал его с этим ограничением и без него (используемая реализация Base32 предполагает, что I и O равны 1 и 0, например).
public static partial class Settings
{
public static string Base32Regex
{
get { return @"[0-9ABCDEFGHJKMNPQRSTVWXYZ]+"; }
}
}