Маршрутизация ASP.NET MVC

До сих пор мне удавалось обойтись без маршрутизации по умолчанию, поставляемой с ASP.NET MVC. К сожалению, теперь, когда я перехожу к более сложным маршрутам, я изо всех сил пытаюсь понять, как заставить это работать.

Простой пример, который я пытаюсь получить, - это иметь путь / User / {UserID} / Items для сопоставления с функцией Items контроллера User. Может ли кто-нибудь сказать мне, что я здесь делаю не так с маршрутизацией?

routes.MapRoute("UserItems", "User/{UserID}/Items", 
                      new {controller = "User", action = "Items"});

И на моей странице aspx

Html.ActionLink("Items", "UserItems", new { UserID = 1 })

person Kevin Pang    schedule 23.09.2008    source источник


Ответы (3)


Следуя коду MVC Preview 4, передо мной стоит перегрузка для Html.ActionLink (), которую вы используете:

public string ActionLink(string linkText, string actionName, object values);

Обратите внимание, что вторым параметром является actionName, а не routeName.

Таким образом, попробуйте:

Html.ActionLink("Items", "Items", new { UserID = 1 })

Или попробуйте:

<a href="<%=Url.RouteUrl("UserItems", new { UserId = 1 })%>">Items</a>
person Matt Mitchell    schedule 23.09.2008

Вы можете разместить дополнительную информацию? Какой URL-адрес создает aspx-страница в ссылке? Это могло быть из-за порядка определения ваших маршрутов. Я думаю, вам нужно, чтобы ваш маршрут был объявлен до маршрута по умолчанию.

person Ricky    schedule 23.09.2008

Сначала посмотрите, какой URL он генерирует, и проверьте его с помощью Фил. Библиотека отладки маршрутов Haack. Это многое прояснит.

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

Более того (и это сугубо личное мнение) мне нравится генерировать свои ссылки где-нибудь в начале страницы в виде строк, а затем помещать эти строки в свой HTML. Это небольшие накладные расходы, но, на мой взгляд, делает код более читаемым. Кроме того, если у вас есть или повторяются ссылки, вам нужно сгенерировать их только один раз.

Я предпочитаю ставить

<% string action = Url.RouteUrl("NamedRoute", new 
    { controller="User",
      action="Items",
      UserID=1});%>

а позже напиши

<a href="<%=action%>">link</a>
person Boris Callens    schedule 03.04.2009