Как мне заставить эту маршрутизацию ASP.NET работать должным образом? - PullRequest
5 голосов
/ 12 февраля 2011

Я пытаюсь написать действительно простой прототип системы CMS с использованием ASP.Net MVC 3.

Система имеет один контроллер с двумя действиями: показать и создать.

Формат действия «Показать» предназначен для использования до 5 необязательных частей, например, domain.com/part1/part2/part3/part4/part5

Формат для шоу'action аналогичен, но должен иметь ведущую часть' create ', например domain.com/create/part1/part2/part3/part4/part5

В моем global.asax есть следующие настройки:

    routes.MapRoute(
        "CreatePageRoute",
        "create/{part1}/{part2}/{part3}/{part4}/{part5}",
        new
            {
                controller = "Page",
                action = "Create",
                part1 = UrlParameter.Optional,
                part2 = UrlParameter.Optional,
                part3 = UrlParameter.Optional,
                part4 = UrlParameter.Optional,
                part5 = UrlParameter.Optional
            });

    routes.MapRoute(
        "Default",
        "{part1}/{part2}/{part3}/{part4}/{part5}",
        new
            {
                controller = "Page",
                action = "Show",
                part1 = UrlParameter.Optional,
                part2 = UrlParameter.Optional,
                part3 = UrlParameter.Optional,
                part4 = UrlParameter.Optional,
                part5 = UrlParameter.Optional
            }
        );

Если моему методу 'Show' не удается найти страницу, соответствующую указанному пути, он возвращает страницу 'not found', которая содержит параметры для создания новой страницы с указанным путем.Эта ссылка определяется следующим образом:

@Html.ActionLink("Yes", "Create") 

[«Да» представляет ответ на вопрос «Вы хотите создать страницу для этого пути?»]

Так когдапроверяя маршрут «По умолчанию», я вижу, что мое действие «Показать» успешно вызывается для всех следующих путей: {пусто} aa / ba / b / ca / ​​b / c / da / b / c / d / e

, что замечательно.

Однако полученная ссылка 'create', сгенерированная оператором "@ Html.ActionLink (" Yes "," Create ")", дает противоречивые результаты.Кажется, генерируется другая гиперссылка в зависимости от длины ввода.Результаты следующие:

Для пути "{empty}" ссылка предлагает "localhost {: port} /" - я надеялся на "localhost {: port} / create"

Для пути "/ a" ссылка предлагает "localhost {: port} /" - я надеялся на "localhost {: port} / create / a"

Для пути "/ a / b",ссылка предлагает "localhost {: port} / a" - я надеялся на "localhost {: port} / create / a / b"

для пути "/ a / b / c", ссылка предлагает"localhost {: port} / a / b" - я надеялся на "localhost {: port} / create / a / b / c"

для пути "/ a / b / c / d",ссылка предлагает "localhost {: port} / create / a / b / c / d" - это то, на что я надеялся

для пути "/ a / b / c / d / e",ссылка предлагает "localhost {: port} / create / a / b / c / d / e" - это то, на что я надеялся

Почему это работает только когда я поставляю "/ a / b / c/ d "или" / a / b / c / d / e "?

Я знаю, что я идиот, пожалуйста, помогите мне

Сэнди

1 Ответ

1 голос
/ 12 февраля 2011

Я полагаю, что множественные необязательные параметры вызывают дискретность.
Как насчет:

    routes.MapRoute("Create5", "create/{part1}/{part2}/{part3}/{part4}/{part5}", new { controller = "Page", action = "Create", part5 = UrlParameter.Optional });
    routes.MapRoute("Create3", "create/{part1}/{part2}/{part3}", new { controller = "Page", action = "Create", part3 = UrlParameter.Optional });
    routes.MapRoute("Create1", "create/{part1}", new { controller = "Page", action = "Create", part1 = UrlParameter.Optional });

    routes.MapRoute("Default5", "{part1}/{part2}/{part3}/{part4}/{part5}", new { controller = "Page", action = "Show", part5 = UrlParameter.Optional });
    routes.MapRoute("Default3", "{part1}/{part2}/{part3}", new { controller = "Page", action = "Show", part3 = UrlParameter.Optional });
    routes.MapRoute("Default1", "{part1}", new { controller = "Page", action = "Show", part1 = UrlParameter.Optional });
...