Використання 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 на null впливає на маршрутизацію посилання?
Дерек Хунзікер

35
Це тому, що якщо ви використовуєте інші параметри, то передбачається, що третім аргументом є значення значень маршруту, а четвертий аргумент - htmlattributes. Додавання 5-го аргументу змушує метод використовувати правильне перевантаження. Прогортайте перевантаження в інтелігенції, і це матиме більше сенсу.
Банфорд

2
Перевантаження ActionLink насправді незграбне. Весь сенс прийняття «об’єкт routeValues» замість RouteValueCollection полягає у зменшенні кількості введення тексту. Однак у кінцевому підсумку потрібно ввести додаткову нуль.
Неінтуїтивні

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 (string linkText, string actionName, string controllerName, object objectValues, object htmlAttributes)

Я використовую MVC 4.

Cheerio!


2
Ваш рядок коду не викликає згадане вами перевантаження, але HtmlHelper.ActionLink (string linkText, string actionName, object objectValues, object 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


Дякую за фактичне посилання - намагався його знайти!
Перхетіян

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об’єкт helper для встановлення 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.