Проблема маршрутизации и отражения - PullRequest
0 голосов
/ 22 сентября 2011

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

Я запускаю решение, и когда я переключаю свою ссылку Избранное, я вижу URL ... / Affaire / Favorite (рисунок ниже). Это нормально для меня.

enter image description here

Когда я переворачиваю ссылку на мою корзину, я вижу URL .. / Affaire / Deleted (рисунок ниже). Это нормально для меня.

enter image description here

Затем я нажимаю ссылку «Корзина», перехожу на соответствующую страницу, и URL, показанный в адресной строке, подходит для меня (рисунок ниже).

enter image description here

Затем я снова переворачиваю ссылку «Избранное» (рисунок ниже), я вижу URL .. / Affaire / Delete? OnlyFavorite = true !! Это не хорошо.

enter image description here

Маршрутизация теперь получает атрибут не по моей ссылке, а с активного URL! Этот атрибут называется OnlyFavorite, и я не хочу этот атрибут. Это «отражение». Обратите внимание, что все мои маршруты используют один и тот же контроллер и одно и то же действие, но используют разные атрибуты для маршрутов.

Ниже приведены ссылки, которые я использовал.

Пример перехода на любимую страницу:

@Html.ActionLink("Favorites", "SearchAffaires", new { OnlyFavorite = true })

Пример перехода на страницу корзины:

@Html.ActionLink("Recycle bin", "SearchAffaires", new { StatusCode = "DELETED" })

Вот мои маршруты:

        routes.MapRoute(
        "Affaire Status Open/Closed/Deleted",                                   // Route name
        "{controller}/{StatusCode}",                                            // URL with parameters
        new { action = "SearchAffaires" },                                      // Parameter defaults
        new { controller = "Affaire", StatusCode = "^Open$|^Closed$|^Deleted$" }// Contraints
        );

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

Есть ли у вас какие-либо идеи, как я могу избежать такого поведения?

Я не хочу, чтобы маршрутизация получала атрибут с именем OnlyFavorite из моего текущего URL по рефлексии. Я уже пытаюсь передать OnlyFavorite = null в ссылке действия, но она не работает: маршрутизация говорит "хорошо, у меня нет значения OnlyFavorite в самой ссылке, но у меня есть OnlyFavorite в URL, поэтому я используйте это! ".

Ответы [ 2 ]

0 голосов
/ 22 сентября 2011

Ну, вы можете использовать помощник Html.RouteLink, чтобы точно указать используемый маршрут. Однако, как указал @counsellorben, вы должны установить свой более конкретный маршрут как первый.

И если нет проблем с отображением вашего URL-адреса типа «Affaire / Favorite / True», вы можете использовать приведенный ниже пример:

 routes.MapRoute(
        "Affaire Only Favorite",                                                // Route name
        "{controller}/Favorite/{OnlyFavorite}",                                                // URL with parameters
        new { action = "SearchAffaires", Page = 1, OnlyFavorite = ""},       // Parameter defaults
        new { controller = "Affaire" }                                          // Contraints
        );
0 голосов
/ 22 сентября 2011

Когда вы находитесь на странице Deleted, ссылка обрабатывается таким образом, поскольку токен StatusCode равен удаленному, поэтому первый маршрут удовлетворен. Измените вашу ссылку следующим образом:

@Html.ActionLink("Favorites", "SearchAffaires", new { StatusCode = String.Empty, OnlyFavorite = true })

ОБНОВЛЕНО

Лучшее решение - поменять маршрут. Как правило, самые конкретные маршруты всегда должны идти первыми, а у вас должны быть более общие маршруты позже. Поскольку маршрут «Только для избранных» более конкретен, он всегда должен идти первым. Если это первый выполненный маршрут, это должно решить вашу проблему.

ОБНОВЛЕНИЕ № 2

Я выполнил тест, и все ссылки были сгенерированы правильно, когда я установил маршруты следующим образом:

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

        routes.MapRoute(
            "Affaire Status Open/Closed/Deleted",                                    // Route name 
            "{controller}/{StatusCode}",                                             // URL with parameters 
            new { action = "SearchAffaires" },                                       // Parameter defaults 
            new { controller = "Affaire", StatusCode = "^Open$|^Closed$|^Deleted$" } // Constraints 
        );

Кроме того, следующие более общие маршруты также генерируются правильно:

        routes.MapRoute(
            "Favorite",                                                    // Route name 
            "{controller}/Favorite",                                       // URL with parameters 
            new { action = "Search", 
                StatusCode = String.Empty, Page = 1, OnlyFavorite = true } // Parameter defaults 
        );

        routes.MapRoute(
            "Status Open/Closed/Deleted",                    // Route name 
            "{controller}/{StatusCode}",                     // URL with parameters 
            new { action = "Search" },                       // Parameter defaults 
            new { StatusCode = "^Open$|^Closed$|^Deleted$" } // Constraints 
        );

Для работы более общих маршрутов мне пришлось переименовать действие как Search, и мне пришлось изменить каждую ссылку с SearchAffaires на Search.

...