HTML.Méthode ActionLink

Disons que j'ai une classe

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

Sur une page qui n'est pas située dans le dossier Item, où réside ItemController, je veux créer un lien vers la méthode Login. Alors, quelle méthode Html.ActionLink je devrais utiliser et quels paramètres devrais-je passer?

Plus précisément, je cherche le remplacement de la méthode

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

Qui a été retiré dans le récent ASP.NET incarnation MVC.

225
demandé sur sharptooth 2008-10-14 13:16:58

10 réponses

Je pense que ce que vous voulez est ceci:

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

Cela utilise la méthode suivante ActionLink signature:

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

ASP.NET MVC2

deux arguments ont été mis autour de

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

Cela utilise la méthode suivante ActionLink signature:

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

ASP.NET MVC3 +

les arguments sont dans le même ordre que MVC2, mais la valeur d'id n'est plus requise:

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

Cela évite de coder en dur tout la logique de routage dans le lien.

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

Cela vous donnera la sortie html suivante, en supposant:

  1. article.Title = "Title"
  2. article.ArticleID = 5
  3. vous avez toujours la route suivante définie

. .

routes.MapRoute(
    "Default",     // Route name
    "{controller}/{action}/{id}",                           // URL with parameters
    new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
);
455
répondu Joseph Kingry 2015-04-22 05:55:54

Je voulais ajouter à la réponse deJoseph Kingry . Il a fourni la solution, mais au début, je ne pouvais pas le faire fonctionner non plus et j'ai obtenu un résultat comme Adhip Gupta. Et puis j'ai réalisé que l'itinéraire doit exister en premier lieu et que les paramètres doivent correspondre exactement à l'itinéraire. J'avais donc un id puis un paramètre de texte pour mon itinéraire qui devait également être inclus.

Html.ActionLink(article.Title, "Login", "Item", new { id = article.ArticleID, title = article.Title }, null)
28
répondu Jeff Widmer 2017-05-23 12:03:07

, Vous voudrez peut-être regarder à l'RouteLink() la méthode.Celui-ci vous permet de tout spécifier (sauf le texte du lien et le nom de l'itinéraire) via un dictionnaire.

17
répondu Haacked 2011-12-08 15:03:59

Je pense que Joseph a renversé le contrôleur et l'action. Vient d'abord l'action puis le contrôleur. C'est un peu étrange, mais la façon dont la signature ressemble.

Juste pour clarifier les choses, c'est la version qui fonctionne (adaptation de L'exemple de Joseph):

Html.ActionLink(article.Title, 
    "Login",  // <-- ActionMethod
    "Item",   // <-- Controller Name
    new { id = article.ArticleID }, // <-- Route arguments.
    null  // <-- htmlArguments .. which are none
    )
14
répondu agez 2011-12-08 15:04:16
Html.ActionLink(article.Title, "Login/" + article.ArticleID, 'Item") 
10
répondu Adhip Gupta 2008-10-14 13:47:11

Qu'en est-il de cela

<%=Html.ActionLink("Get Involved", 
                   "Show", 
                   "Home", 
                   new 
                       { 
                           id = "GetInvolved" 
                       }, 
                   new { 
                           @class = "menuitem", 
                           id = "menu_getinvolved" 
                       }
                   )%>
10
répondu Hasan 2011-03-03 18:41:56

Si vous voulez aller tous les fantaisie-pantalon, voici comment vous pouvez l'étendre pour être capable de faire cela:

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

Vous devrez mettre ceci dans l'espace de noms 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;
    }
}

Cela inclut deux remplacements pour Route Values et HTML Attributes, en outre, toutes vos vues devraient ajouter: @using YourProject.Controllers ou vous pouvez l'ajouter à votre web.config <pages><namespaces>

8
répondu Serj Sagan 2013-12-26 21:29:22

Utilisez les paramètres nommés pour une meilleure lisibilité et éviter toute confusion:

@Html.ActionLink(
            linkText: "Click Here",
            actionName: "Action",
            controllerName: "Home",
            routeValues: new { Identity = 2577 },
            htmlAttributes: null)
5
répondu guneysus 2015-09-14 11:56:04

Avec MVC5 Je l'ai fait comme ça et c'est du code de travail à 100%....

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

Vous pouvez avoir une idée de ceci...

1
répondu Sohail Malik 2015-08-25 13:36:17

Ce TYPE utiliser:

@ Html.ActionLink("Page D'Accueil","Index","Maison")

MainPage: nom du texte Index: Vue Action Accueil: HomeController

Base Utiliser 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>
-1
répondu Serdin çelik 2017-05-17 20:29:02