asp.net отображает маршрут с параметром внутри контроллера и просматривает - PullRequest
0 голосов
/ 05 августа 2010

Мне нужно создать схему URL, подобную этой

friend/{userid}/wishlist

, где friend - это контроллер, wishlist - это представление, а userid - это идентификатор друга, список желаний которого вы хотели бы видеть.

Я настроил маршрут, подобный этому

 routes.MapRoute(
            "FriendWishlist",
            "friend/{userid}/wishlist",
            new { controller = "WishList", action="FriendWishlist", userid = 123}
            );

, когда я пытаюсь перейти к /friend/123/wishlist, я получаю следующую ошибку

Метод открытого действия '123'не найден на контроллере «GiffrWeb.Areas.Api.Controllers.FriendController».

1 Ответ

1 голос
/ 05 августа 2010

Маршруты в MVC оцениваются в порядке их объявления. Это звучит очень похоже на то, что вы объявили свой маршрут ниже по умолчанию:

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

routes.MapRoute(
    "FriendWishlist",
    "friend/{userid}/wishlist",
    new { controller = "WishList", action="FriendWishlist", userid = 123}
);

Итак, инфраструктура MVC пытается сначала сопоставить ваш URL /friend/123/wishlist с маршрутом по умолчанию. Поскольку это все переменные и все имеют значения по умолчанию или являются необязательными, они гарантированно совпадают. Он не проверяет, существуют ли контроллеры и действия, и принимает соответствующие аргументы. У вас есть FriendController класс - проверка. 123 действие - оно взрывается.

Самое простое исправление - объявите маршрут выше маршрута по умолчанию (т. Е. Просто поменяйте местами эти два оператора), и он должен работать ОК.

Я мог бы просто добавить, что кажется немного странным, что URL-адрес, начинающийся с /friend/, направляется на контроллер WishList, когда у вас, очевидно, есть контроллер Friend (ваше сообщение об ошибке так говорит).

Наконец, я не могу рекомендовать достаточно сильно, чтобы, если вы вводите пользовательскую маршрутизацию, вы также тщательно тестировали эти маршруты - как вы видели, механизм маршрутизации часто может не делать то, что вы думаете, он делает. Я рекомендую либо тестировать маршрут в MvcContrib , либо в блоге Брэда Уилсона .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...