Можно настроить маршрут {id} / {controller} / {action} с нулевым {id}? - PullRequest
1 голос
/ 28 ноября 2011

У меня есть сайт, который по деловым причинам должен иметь нестандартную настройку маршрутизации после

{id}/{controller}/{action}.

Вместо http://site/Controller/Id, мне нужно, чтобы он направлялся на http://site/Id/Controller.Это работает нормально в 99% случаев, но если идентификатор не указан, будет использоваться предполагаемое значение (давайте просто назовем его «0»).

Мне удалось получить контроллер Home, указав значения по умолчанию, но чтоУбив меня, я пытаюсь заставить http://site/MyController функционировать так, как будто это действительно http://site/0/MyController.Кажется, что каждая комбинация, которую я пробую, пытается оценить {id} с "MyController" в отсутствие фактического {id}.

Это мой RegisterRoutes в настоящее время:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    routes.IgnoreRoute("{*favicon}", new { favicon = @"(.*/)?favicon.ico(/.*)?" });

    routes.MapRoute(
        "Default",
        "{id}/{controller}/{action}",
        new { controller = "Home", action = "Index", id = "0" }
    );
}

1 Ответ

4 голосов
/ 29 ноября 2011

Дополнительные сегменты могут быть размещены только в конце вашего маршрута или лучше после требуемых .Вот почему вы должны добавить дополнительное определение маршрута без сегмента id, которое также определяет его по умолчанию как 0.

id является числовым

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    routes.IgnoreRoute("{*favicon}", new { favicon = @"(.*/)?favicon.ico(/.*)?" });

    routes.MapRoute(
        "Default",
        "{id}/{controller}/{action}",
        new { controller = "Home", action = "Index" },
        new { id = @"\d+" }
    );

    routes.MapRoute(
        "DefaultId",
        "{controller}/{action}",
        new { controller = "Home", action = "Index", id = "0" }
    );
}

Как видите,первое определение маршрута также включает в себя ограничение для сегмента id, которое требует, чтобы он был числовым.Это хитрость.

id является буквенно-цифровым, но не совпадает ни с одним именем контроллера

В случае, если id не числовое, но может быть буквенно-цифровым, вам придется использовать другой подход...

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    routes.IgnoreRoute("{*favicon}", new { favicon = @"(.*/)?favicon.ico(/.*)?" });

    routes.MapRoute(
        "DefaultId",
        "{controller}/{action}",
        new { controller = "Home", action = "Index", id = "0" },
        new { controller = @"Home|Admin|Categories|Items" }
    );

    routes.MapRoute(
        "Default",
        "{id}/{controller}/{action}",
        new { controller = "Home", action = "Index", id = "0" }
    );
}

Тогда вам нужно будет наложить ограничение на сегмент controller, потому что у вас есть их конечное число.Имейте в виду, что определения маршрутов поменялись местами, так что идентификатор без идентификатора теперь первый, а с id - второй.Это должно работать до тех пор, пока id никогда не может иметь то же значение, что и имя контроллера.

id может быть чем-то действительно

Но что, если id может иметь значение, равноеимя контроллера?В таком случае вам придется более строго определять правила маршрутизации, поскольку вам, скорее всего, придется опускать значения по умолчанию и предоставлять больше маршрутов на основе количества сегментов: ноль, один, два, три или даже больше, если требуется.

...