ASP MVC Routing с> 1 параметром - PullRequest
       16

ASP MVC Routing с> 1 параметром

3 голосов
/ 27 ноября 2008

У меня определен следующий маршрут

            routes.MapRoute(
            "ItemName",
            "{controller}/{action}/{projectName}/{name}",
            new { controller = "Home", action = "Index", name = "", projectName = "" }
            );

Этот маршрут действительно работает, поэтому, если я наберу в браузере

/Milestone/Edit/Co-Driver/Feature complete

Он корректно переходит к контроллеру Milestone, действию редактирования и передает значения.

Однако, если я попытаюсь создать ссылку в представлении с помощью url.action -

<%=Url.Action("Edit", "Milestone", new {name=m.name, projectName=m.Project.title})%>

Я получаю следующий URL

Milestone/Edit?name=Feature complete&projectName=Co-Driver

Это все еще работает, но не очень чисто. Есть идеи?

Ответы [ 3 ]

5 голосов
/ 27 ноября 2008

При построении и сопоставлении маршрутов в маршрутизации ASP.NET (именно это использует ASP.NET MVC), используется первое соответствующее сопоставление, а не самое жадное, и важен порядок.

Итак, если у вас есть два маршрута:

"{controller}/{action}/{id}"
"{controller}/{action}/{projectName}/{name}"

в указанном порядке, тогда будет использован первый. Дополнительные значения, в данном случае projectName и name, становятся параметрами запроса.

Фактически, поскольку вы указали значения по умолчанию для {projectName} и {name}, он полностью конфликтует с маршрутом по умолчанию. Вот ваш выбор:

  • Удалить маршрут по умолчанию. Сделайте это, если вам больше не нужен маршрут по умолчанию.

  • Сначала переместите более длинный маршрут и сделайте его более явным, чтобы он не совпадал с маршрутом по умолчанию, например:

    routes.MapRoute(
        "ItemName",
        "Home/{action}/{projectName}/{name}",
        new { controller = "Home", action = "Index", name = "", projectName = "" }
    );
    

    Таким образом, любые маршруты с контроллером == Home будут соответствовать первому маршруту, а любые маршруты с контроллером! = Home будут соответствовать второму маршруту.

  • Используйте RouteLinks вместо ActionLinks, конкретно указав, какой маршрут вам нужен, чтобы сделать правильную ссылку без двусмысленности.

1 голос
/ 28 ноября 2008

Просто чтобы прояснить, вот что я наконец-то сделал, чтобы решить эту проблему, благодаря ответу @ Brad

<%=Html.RouteLink("Edit", "ItemName", new { projectName=m.Project.title, name=m.name, controller="Milestone", action="Edit"})%>
0 голосов
/ 27 ноября 2008

Вы можете попробовать

Html.RouteLink("Edit","ItemName", new {name=m.name, projectName=m.Project.title});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...