ActionLink не работает, но RouteUrl делает - PullRequest
4 голосов
/ 26 октября 2008

У меня есть маршрут

// Sample URL: /Fixtures/Team/id
routes.MapRoute(
     "Fixtures-by-TeamID",
     "Fixtures/Team/{teamId}",
     new { controller = "Fixtures", action = "GetByTeamID", },
     new { teamId = @"\d{1,3}" }
);

и я пытаюсь использовать ActionLink в ASP.net MVC p5.

<%= Html.ActionLink(g.HomeTeam.TeamName, "Team", new { teamId = g.HomeTeam.TeamID })%>

Однако это не работает и дает мне

<a href="/Fixtures/Team?teamId=118">Team A</a>

Если я использую Url.RouteUrl, я получаю правильную ссылку.

<a href="<%=Url.RouteUrl("Fixtures-by-TeamID", new { teamId = g.HomeTeam.TeamID })%>"><%=g.HomeTeam.TeamName%></a>   

<a href="/Fixtures/Team/118">Team A</a>

Любая помощь будет великолепна? Будет ли это изменение в ASP.net MVC бета?

Спасибо

Дональд

Ответы [ 4 ]

1 голос
/ 27 октября 2008

Вы уже пробовали это?

Html.ActionLink<FixturesController>(c => c.GetByTeamID(g.HomeTeam.TeamID), "Team")

Также

Возможно, вы захотите добавить action = "GetByTeamID" к вашим ограничениям.

1 голос
/ 26 октября 2008

Попробуйте это:

// Sample URL: /Fixtures/Team/id
routes.MapRoute(
     "Fixtures-by-TeamID",
     "Fixtures/Team/{teamId}",
     new { controller = "Fixtures", action = "Team", teamId = -1 }
);

ваш контроллер должен выглядеть так:

public class FixturesController : BaseController // or whatever 
{
  /*...*/
  public ActionResult Team(int teamId)
  {
     return View("Detail", Team.GetTeamById(teamId)) // or whatever
  }
  /*...*/
}

И ваша ссылка будет выглядеть

<%= Html.ActionLink("Click here for the team details", "Team", "Fixtures", new { teamId = ViewModel.Data.Id /*orwhateverlol*/ }) %>

(у меня нет MVC на этой машине, так что это все из памяти; может быть синтаксическая ошибка или некоторые аргументы поменялись местами).

Обратите внимание, что путь к вашей карте маршрута соответствует вашему 1) контроллеру, 2) действию 3) имени аргумента. Я обнаружил, что действие по умолчанию (третий аргумент в MapRoute) работает, в то время как ваша перегрузка этого метода я никогда раньше не видел (может быть задержка от предыдущего выпуска).

Также обратите внимание, как ваш FixturesController соответствует пути (Fixtures) и имени действия (Team), а также соответствует аргументу (teamId).

Наконец, последний аргумент вашего ActionLink должен совпадать с аргументами вашего контроллера по имени (teamId) и типу.

На данный момент это слишком "волшебно" (на заднем плане происходит МНОГО сравнения строк!). Надеюсь, со временем это улучшится. Старый стиль Expression был НАМНОГО лучше. По сути, вы назвали метод, который вы хотели запустить, со значениями, которые вы хотели бы передать. Я надеюсь, что они вернут этот стиль выражения обратно в рамки. Хаак

1 голос
/ 26 октября 2008

По моему опыту, единственные маршруты действия времени действительно работают должным образом, когда у вас есть только один маршрут по умолчанию. Как только вы начинаете добавлять пользовательские маршруты, подобные вашим, маршруты действий становятся ... Я думаю, что "привередливый" - правильное слово. Система сопоставления работает не совсем так, как вы ожидаете.

В этом случае вы сказали, что действие было «Команда», но этот маршрут не соответствует действию «Команда», он только соответствует «GetTeamByID». Таким образом, система маршрутизации продолжает работать и в итоге дает вам маршрут на основе маршрута по умолчанию. TeamId явно не является частью вашего маршрута по умолчанию, поэтому он заканчивается как параметр запроса, прикрепленный к концу.

Бета-версия MVC уже отправлена, и это поведение не изменилось.

Кроме того, вы не находите названный маршрут более понятным? Лично я делаю.

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

<a href="<%= Url.FixturesByTeam(g.HomeTeam.TeamID) %>"><%= g.HomeTeam.TeamName %></a>

Или даже:

<%= Html.LinkToFixturesByTeam(g.HomeTeam) %>

где вы можете получить значения для имени и идентификатора непосредственно из модели.

0 голосов
/ 26 октября 2008

Когда параметр (в данном случае «действие») определен только в значениях по умолчанию, а не в URL-адресе маршрута, он должен быть точным совпадением (если вы не заставите его идти против определенного маршрута, как в случае RouteUrl) .

Чтобы все работало как сейчас, вы можете добавить еще один маршрут в список чуть ниже указанного выше маршрута:

routes.MapRoute ( "Светильники-по-TeamID1", "Светильники / команды / {TeamID}", new {controller = "Fixtures", action = "Team",}, new {teamId = @ "\ d {1,3}"} );

ИЛИ вы можете добавить параметр действия в URL маршрута,

ИЛИ вы можете использовать названный маршрут, как и вы.

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