w3schools mvc htmlattributes ejemplos c# .net asp.net-mvc html-helper actionlink

c# - mvc - html.actionlink htmlattributes



Método HTML.ActionLink (10)

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 del elemento, 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 pasar?

En concreto, estoy buscando la sustitución del método.

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

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


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


Creo que José volteó controlador y acción. Primero viene la acción y luego el controlador. Esto es algo extraño, pero el aspecto de la firma.

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

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


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, el valor de id ya no es necesario:

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 codificación de cualquier lógica de enrutamiento en el enlace.

<a href="/Item/Login/5">Title</a>

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

  1. article.Title = "Title"
  2. article.ArticleID = 5
  3. Aún tienes la siguiente ruta definida

. .

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


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


Este tipo de uso:

@ Html.ActionLink ("MainPage", "Index", "Home")

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

Uso básico ActionLink

<html> <head> <meta name="viewport" content="width=device-width" /> <title>_Layout</title> <link href="@Url.Content("~/Content/bootsrap.min.css")" rel="stylesheet" type="text/css" /> </head> <body> <div class="container"> <div class="col-md-12"> <button class="btn btn-default" type="submit">@Html.ActionLink("AnaSayfa","Index","Home")</button> <button class="btn btn-default" type="submit">@Html.ActionLink("Hakkımızda", "Hakkimizda", "Home")</button> <button class="btn btn-default" type="submit">@Html.ActionLink("Iletişim", "Iletisim", "Home")</button> </div> @RenderBody() <div class="col-md-12" style="height:200px;background-image:url(/img/footer.jpg)"> </div> </div> </body> </html>


Quería agregar a la respuesta de Joseph Kingry . Él proporcionó la solución, pero al principio tampoco pude hacer que funcionara y obtuve un resultado como Adhip Gupta. Y luego me di cuenta de que la ruta tiene que existir en primer lugar y 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 tenía que ser incluido.

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


Si quieres ir a todos los pantalones de fantasía, aquí es cómo puedes extenderlo para poder hacer esto:

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

Tendrá que poner esto en el espacio de nombres System.Web.Mvc :

public static class MyProjectExtensions { public static MvcHtmlString ActionLink<TController>(this HtmlHelper htmlHelper, Expression<Action<TController>> 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<TController, TAction>(this HtmlHelper htmlHelper, Expression<Action<TController, TAction>> 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<TController>(this HtmlHelper htmlHelper, Expression<Action<TController>> 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<string, object> AnonymousObjectToKeyValue(object anonymousObject) { var dictionary = new Dictionary<string, object>(); if (anonymousObject == null) return dictionary; foreach (PropertyDescriptor propertyDescriptor in TypeDescriptor.GetProperties(anonymousObject)) { dictionary.Add(propertyDescriptor.Name, propertyDescriptor.GetValue(anonymousObject)); } return dictionary; } }

Esto incluye dos anulaciones para los Route Values y los HTML Attributes , además, todas sus vistas deberán agregarse: @using YourProject.Controllers o puede agregarlo a su web.config <pages><namespaces>


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


que hay de esto

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


Html.ActionLink(article.Title, "Login/" + article.ArticleID, ''Item")