Использование Html.ActionLink для вызова действия на другом контроллере


224

Я пытаюсь перемещаться между контроллерами с помощью ActionLink. Я расскажу мою проблему с примером.

Я использую индексное представление контроллера Hat и пытаюсь использовать приведенный ниже код для создания ссылки на действие «Подробности» контроллера продукта.

<%= Html.ActionLink("Details", "Details", "Product", new { id=item.ID }) %>

Вместо создания ссылки на подробности на контроллере продукта это создает ссылку на действие Подробности в контроллере Hat и добавляет параметр длины в его конец:

Hat/Details/9?Length=7

Я не могу использовать HTML.ActionLinkдля переключения между контроллерами из-за этой проблемы. Буду признателен, если вы укажете мне, что я делаю неправильно. Спасибо

PS: я использую настройку маршрута по умолчанию, которая поставляется с MVC

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

Ответы:


409

То, что вы хотите, это перегрузка:

//linkText, actionName, controllerName, routeValues, htmlAttributes
<%=Html.ActionLink("Details", "Details", 
    "Product", new {id = item.ID}, null) %>

1
Можете ли вы объяснить, почему эта конкретная перегрузка работает, а Корки - нет? Как установка пустых атрибутов htmlAttributes влияет на маршрутизацию ссылки?
Дерек Хунзикер

35
Это потому, что если вы используете другие параметры, предполагается, что третий аргумент - это значения маршрута, а 4-й аргумент - это htmlattributes. Добавление 5-го аргумента заставляет метод использовать корректную перегрузку. Пролистайте перегрузки в intellisense, и это будет иметь больше смысла.
Бэнфорд

2
Перегрузка ActionLink действительно неуклюжа. Весь смысл принятия «object routeValues» вместо RouteValueCollection состоит в том, чтобы уменьшить количество операций ввода. Тем не менее, вам в конечном итоге придется ввести дополнительный ноль. Не интуитивный и контрпродуктивный ...
TiMoch

3
Я согласен, параметры перегрузки плохо разработаны .. Я думал, что это ошибка в течение самого длительного времени. Мне действительно пришлось в 9-й раз смотреть на все интеллигентность, чтобы понять, что я использовал неправильную подпись
Bkwdesign

1
Для будущих читателей, если вы решите эту проблему и попытаетесь добавить стиль CSS, это правильная перегрузка. @ Html.ActionLink ("MyText", "MyAction", "MyController", null, new {@class = "myClass"})
granadaCoder

17

С этими параметрами вы запускаете неправильную перегруженную функцию / метод.

Что сработало для меня:

<%= Html.ActionLink("Details", "Details", "Product", new { id=item.ID }, null) %>

Он запускает HtmlHelper.ActionLink (строка linkText, строка actionName, строка controllerName, объект routeValues, объект htmlAttributes)

Я использую MVC 4.

Cheerio!


2
Ваша строка кода не вызывает упомянутую вами перегрузку, но HtmlHelper.ActionLink (строка linkText, строка actionName, объект routeValues, объект htmlAttributes). Это дает тот же результат, который ОП пытался избежать. Вам необходимо добавить дополнительный нулевой параметр.
TiMoch

Спасибо TiMoch, пропустил тот?
Стефан Вентер

12

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

@Html.ActionLink(
    linkText: "Details",
    actionName: "Details",
    controllerName: "Product",
    routeValues: new {
        id = item.ID
    },
    htmlAttributes: null
)

С 2019 года эта функция реализована в ReSharper JetBrains. Это на самом деле очень полезно для этого обстоятельства.
Джейми

10

Если вы возьмете сборку MVC Futures (которую я очень рекомендую), вы можете использовать универсальный тип при создании ActionLink и лямбду для построения маршрута:

<%=Html.ActionLink<Product>(c => c.Action( o.Value ), "Details" ) %>

Вы можете получить сборку фьючерсов здесь: http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24471


Спасибо за актуальную ссылку - пытался ее найти!
Perhentian

1
Осторожнее с этим, хотя он не был включен в MVC2. Причина заключается в том, что Действия не обязательно являются Методами (с чем я согласен, но будет сложно перенести, так как мы уже давно используем универсальный метод). Вот полная статья о том, почему это не было сохранено в 2: haacked.com/archive/2008/08/29/…
Stu

7

Вы неправильно выполняете перегрузку ActionLink. Попробуйте это вместо этого.

<%= Html.ActionLink("Details", "Details", "Product", new RouteValueDictionary(new { id=item.ID })) %>


3

Альтернативным решением будет использование Urlвспомогательного объекта для установки hrefатрибута <a>тега, например:

<a href="@Url.Action("Details", "Product",new { id=item.ID }) )">Details</a>

1

Обратите внимание, что Подробности - это страница «Просмотр» в папке «Продукты».

ProductId является первичным ключом таблицы. Вот строка из Index.cshtml

 @Html.ActionLink("Details", "Details","Products" , new  {  id=item.ProductId  },null)

0

этот код работал для меня в частичном представлении:

<a href="/Content/Index?SubCategoryId=@item.Id">@item.Title</a>

Хотя это работает, оно обходит весь смысл использования ActionLink ... весь смысл ActionLink состоит в том, чтобы избегать ручного ввода URL-адреса и потенциальных проблем, которые могут возникнуть
Jon Story
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.