ASP.NET : ActionLink возвращает относительный URL

#asp.net-mvc-2 #c#-4.0

#asp.net-mvc-2 #c #-4.0

Вопрос:

Я новичок в работе над MVC2 asp.net проекты.

Мне было интересно, возможно ли иметь ссылку на действие, подобную этой:

 <%: Html.ActionLink("[Add To Cart]", "../StoreCart/AddToCart", new { id = Model.id })%>
  

Обратите внимание на ../StoreCart .

Вот пример возвращаемого URL (в данный момент я нахожусь на экране магазина, когда вижу ссылку ActionLink, но я хотел бы выйти, так сказать, «на один уровень выше»):

Ошибка (404): http://localhost:8231/StoreScreen/StoreCart/AddToCart?id=9

Желаемый: http://localhost:8231/StoreCart/AddToCart?id=9

Спасибо!

PS: Почему вы не можете просто сделать что-то подобное php и написать пользовательский <a href="<%: index "/StoreCart/AddToCart?id=" id %>" > add to cart </a> 🙂

Ответ №1:

ActionLink Не предназначено указывать на физический URL-адрес, скорее на действие в контроллере.

 <%: Html.ActionLink("[Add To Cart]", "AddToCart", "StoreCart", new { id = Model.id }, null)%>
  

Примечание: Окончательный вариант null необходим, поскольку этого требует переопределение ActionLink . Это модель, и она может быть object или null.

Документы

Комментарии:

1. спасибо, что указали на параметр «, null», я этого не заметил: P

Ответ №2:

Вы не должны передавать ../StoreCart/AddToCart в качестве аргумента в ActionLink . Вторым аргументом ActionLink является имя действия, и я сильно сомневаюсь, что ваше действие вызвано ../StoreCart/AddToCart .

Итак, что вы хотите (который использовал бы тот же контроллер, что и текущий URL-адрес запроса):

 <%: Html.ActionLink("[Add To Cart]", "AddToCart", new { id = Model.id }) %>
  

и если вы хотите установить конкретный контроллер, просто используйте соответствующую перегрузку:

 <%: Html.ActionLink(
     "[Add To Cart]", 
     "AddToCart", 
     "StoreCart", 
     new { id = Model.id }, 
     null
) %>
  

И вот список всех доступных перегрузок, с которыми я бы рекомендовал вам ознакомиться.

Комментарии:

1. Я уже пробовал это и подумал, что это неправильный способ. Потому что, когда я использую то, что вы предложили, я получаю этот URL: http://localhost:8231/StoreScreen/AddToCart?Length=9 (StoreScreen вместо StoreCart), а также, как насчет этой вещи с длиной = 9? Это длина строки параметра, которую я передаю для значения routeValue: «StoreCart»

2. @Twodordan, о, это из-за вашей конфигурации маршрутизации. ActionLink просто использует ваши маршруты.

3. Извините, моя ошибка, не увидел значение null

4. @Twodordan, да, значение null в конце указывает на htmlAttributes параметр. Позволяет передавать такие вещи, как @class и т.д., В этот элемент привязки.