Método HTML.ActionLink

Digamos que tengo una clase

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

En una página que no se encuentra en la carpeta de elementos, donde reside ItemController , quiero crear un enlace al método de Login . Entonces, ¿qué método Html.ActionLink debería usar y qué parámetros debo aprobar?

Específicamente, estoy buscando el reemplazo del método

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

que ha sido retirado en la reciente encarnación de ASP.NET MVC.

Creo que lo que quieres es esto:

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). ) 

Esto utiliza el siguiente método de firma ActionLink:

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

ASP.NET MVC2

dos argumentos han sido cambiados

 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). ) 

Esto utiliza el siguiente método de firma ActionLink:

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

ASP.NET MVC3 +

los argumentos están en el mismo orden que MVC2, sin embargo, ya no se requiere el valor de identificación:

 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). ) 

Esto evita la encoding forzada de cualquier lógica de enrutamiento en el enlace.

  Title 

Esto le dará la siguiente salida html, suponiendo que:

  1. article.Title = "Title"
  2. article.ArticleID = 5
  3. usted todavía tiene la siguiente ruta definida

. .

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

Quería agregar a la respuesta de Joseph Kingry . Me brindó la solución, pero al principio tampoco pude hacer que funcionara y obtuve un resultado como el de Adhip Gupta. Y luego me di cuenta de que la ruta debe existir en primer lugar y que los parámetros deben coincidir exactamente con la ruta. Así que tenía una identificación y luego un parámetro de texto para mi ruta que también debía incluirse también.

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

Es posible que desee ver el RouteLink() Este le permite especificar todo (excepto el texto del enlace y el nombre de la ruta) a través de un diccionario.

Creo que Joseph cambió el controlador y la acción. Primero viene la acción y luego el controlador. Esto es algo extraño, pero la forma en que se ve la firma.

Solo para aclarar las cosas, esta es la versión que funciona (adaptación del ejemplo de José):

 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") 

que tal esto

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

Si quieres ponerte todo de pantalones de lujo, así es cómo puedes ampliarlo para poder hacer esto:

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

Deberá poner esto en el espacio de nombres 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; } } 

Esto incluye dos sustituciones para Route Values y HTML Attributes , también, todas las vistas deberían agregarse: @using YourProject.Controllers o puede agregarlo a su web.config

Use parámetros con nombre para una mejor legibilidad y evite confusiones:

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

Con MVC5 lo he hecho así y es un código 100% funcional …

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

Ustedes pueden tener una idea de esto …

Este tipo de uso:

@ Html.ActionLink (“MainPage”, “Index”, “Home”)

Página principal: Nombre del texto Índice: Vista de acción Inicio: HomeController

Base Use ActionLink

    _Layout    
@RenderBody()