Метод HTML.ActionLink

Допустим, у меня есть class

public class ItemController:Controller { public ActionResult Login(int id) { return View("Hi", id); } } 

На странице, которая не находится в папке Item, где находится ItemController , я хочу создать ссылку на метод Login . Итак, какой метод Html.ActionLink я должен использовать и какие параметры следует передавать?

В частности, я ищу замену метода

 Html.ActionLink(article.Title, new { controller = "Articles", action = "Details", id = article.ArticleID }) 

который был удален в недавнем воплощении ASP.NET MVC.

Я думаю, что вы хотите:

ASP.NET MVC1

 Html.ActionLink(article.Title, "Login", // <-- Controller Name. "Item", // <-- ActionMethod new { id = article.ArticleID }, // <-- Route arguments. null // <-- htmlArguments .. which are none. You need this value // otherwise you call the WRONG method ... // (refer to comments, below). ) 

Это использует следующий метод подписи ActionLink:

 public static string ActionLink(this HtmlHelper htmlHelper, string linkText, string controllerName, string actionName, object values, object htmlAttributes) 

ASP.NET MVC2

два аргумента были отключены

 Html.ActionLink(article.Title, "Item", // <-- ActionMethod "Login", // <-- Controller Name. new { id = article.ArticleID }, // <-- Route arguments. null // <-- htmlArguments .. which are none. You need this value // otherwise you call the WRONG method ... // (refer to comments, below). ) 

Это использует следующий метод подписи ActionLink:

 public static string ActionLink(this HtmlHelper htmlHelper, string linkText, string actionName, string controllerName, object values, object htmlAttributes) 

ASP.NET MVC3 +

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

 Html.ActionLink(article.Title, "Item", // <-- ActionMethod "Login", // <-- Controller Name. new { article.ArticleID }, // <-- Route arguments. null // <-- htmlArguments .. which are none. You need this value // otherwise you call the WRONG method ... // (refer to comments, below). ) 

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

  Title 

Это даст вам следующий вывод html, предполагающий:

  1. article.Title = "Title"
  2. article.ArticleID = 5
  3. у вас все еще есть определенный маршрут

, ,

 routes.MapRoute( "Default", // Route name "{controller}/{action}/{id}", // URL with parameters new { controller = "Home", action = "Index", id = "" } // Parameter defaults ); 

Я хотел добавить к ответу Джозефа Кингри . Он предоставил решение, но поначалу я не мог заставить его работать и получил результат, как и Adhip Gupta. И тогда я понял, что маршрут должен существовать в первую очередь, и параметры должны точно соответствовать маршруту. Таким образом, у меня был идентификатор, а затем текстовый параметр для моего маршрута, который также должен был быть включен.

 Html.ActionLink(article.Title, "Login", "Item", new { id = article.ArticleID, title = article.Title }, null) 

Возможно, вы захотите посмотреть на метод RouteLink() Это позволяет вам указывать все (кроме текста ссылки и названия маршрута) через словарь.

Я думаю, что Иосиф перевернул controller и действия. Сначала идет действие, затем controller. Это несколько странно, но, как выглядит подпись.

Чтобы прояснить ситуацию, это версия, которая работает (адаптация примера Джозефа):

 Html.ActionLink(article.Title, "Login", // <-- ActionMethod "Item", // <-- Controller Name new { id = article.ArticleID }, // <-- Route arguments. null // <-- htmlArguments .. which are none ) 
 Html.ActionLink(article.Title, "Login/" + article.ArticleID, 'Item") 

как насчет этого

 <%=Html.ActionLink("Get Involved", "Show", "Home", new { id = "GetInvolved" }, new { @class = "menuitem", id = "menu_getinvolved" } )%> 

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

 @(Html.ActionLink(x => x.Details(), article.Title, new { id = article.ArticleID })) 

Вам нужно будет поместить это в System.Web.Mvc имен System.Web.Mvc :

 public static class MyProjectExtensions { public static MvcHtmlString ActionLink(this HtmlHelper htmlHelper, Expression> expression, string linkText) { var urlHelper = new UrlHelper(htmlHelper.ViewContext.RequestContext, htmlHelper.RouteCollection); var link = new TagBuilder("a"); string actionName = ExpressionHelper.GetExpressionText(expression); string controllerName = typeof(TController).Name.Replace("Controller", ""); link.MergeAttribute("href", urlHelper.Action(actionName, controllerName)); link.SetInnerText(linkText); return new MvcHtmlString(link.ToString()); } public static MvcHtmlString ActionLink(this HtmlHelper htmlHelper, Expression> expression, string linkText, object routeValues) { var urlHelper = new UrlHelper(htmlHelper.ViewContext.RequestContext, htmlHelper.RouteCollection); var link = new TagBuilder("a"); string actionName = ExpressionHelper.GetExpressionText(expression); string controllerName = typeof(TController).Name.Replace("Controller", ""); link.MergeAttribute("href", urlHelper.Action(actionName, controllerName, routeValues)); link.SetInnerText(linkText); return new MvcHtmlString(link.ToString()); } public static MvcHtmlString ActionLink(this HtmlHelper htmlHelper, Expression> expression, string linkText, object routeValues, object htmlAttributes) where TController : Controller { var urlHelper = new UrlHelper(htmlHelper.ViewContext.RequestContext, htmlHelper.RouteCollection); var attributes = AnonymousObjectToKeyValue(htmlAttributes); var link = new TagBuilder("a"); string actionName = ExpressionHelper.GetExpressionText(expression); string controllerName = typeof(TController).Name.Replace("Controller", ""); link.MergeAttribute("href", urlHelper.Action(actionName, controllerName, routeValues)); link.MergeAttributes(attributes, true); link.SetInnerText(linkText); return new MvcHtmlString(link.ToString()); } private static Dictionary AnonymousObjectToKeyValue(object anonymousObject) { var dictionary = new Dictionary(); if (anonymousObject == null) return dictionary; foreach (PropertyDescriptor propertyDescriptor in TypeDescriptor.GetProperties(anonymousObject)) { dictionary.Add(propertyDescriptor.Name, propertyDescriptor.GetValue(anonymousObject)); } return dictionary; } } 

Это включает в себя два переопределения для Route Values и HTML Attributes Кроме того, вам нужно будет добавить все ваши представления: @using YourProject.Controllers или вы можете добавить его в свой web.config

Используйте именованные параметры для лучшей читаемости и избегайте путаницы:

 @Html.ActionLink( linkText: "Click Here", actionName: "Action", controllerName: "Home", routeValues: new { Identity = 2577 }, htmlAttributes: null) 

С MVC5 я сделал это так и это 100% рабочий код ….

 @Html.ActionLink(department.Name, "Index", "Employee", new { departmentId = department.DepartmentID }, null) 

Вы, ребята, можете получить представление об этом …

Этот тип использует:

@ Html.ActionLink ( “MainPage”, “Index”, “Начало”)

MainPage: Название текста Index: Action View Home: HomeController

База использования ActionLink

    _Layout    
@RenderBody()
  • Как создать текстовое поле readonly в ASP.NET MVC3 Razor
  • Бритва: декларативные HTML-помощники
  • Разница между Html.RenderAction и Html.Action
  • Использование MVC HtmlHelper из WebForm
  • ASP.NET MVC DropDownListFor с моделью типа Список
  • В чем разница между RouteLink и ActionLink в ASP.NET MVC?
  • Interesting Posts

    Программируемая версия подмножества – для оценки ее состояния при вызове из другой функции

    Как фильтровать NSFetchedResultsController (CoreData) с помощью UISearchDisplayController / UISearchBar

    Как построить Uber JAR (FAT JAR) с использованием SBT в IntelliJ IDEA?

    Поворотные и интервальные метки на оси ggplot2

    Поддерживать соотношение сторон по ширине и высоте

    Самый последний предыдущий рабочий день в Python

    C ++ 11: Замените все необработанные указатели на std :: shared_ptr ()?

    Как создать RecyclerView с несколькими типами просмотра?

    Настройка Notepad ++ найти стиль результатов

    WooCommerce: добавьте поле ввода к каждому элементу в корзине

    Как исправить TypeError: Unicode-объекты должны быть закодированы перед хешированием?

    Разделить строку строки фрейма данных на несколько столбцов

    Использовать OneDrive в качестве дополнительного места резервного копирования

    Как эффективно удалять дубликаты из массива без использования Set

    Лучше ли оставить или отключить внешний жесткий диск?

    Давайте будем гением компьютера.