Pourquoi ne Html.Rendu ActionLink"?Longueur = 4"

Je suis très confus quant à la raison pour laquelle ce code

Html.ActionLink("About", "About", "Home", new { hidefocus = "hidefocus" })

Résultats dans ce lien:

<a hidefocus="hidefocus" href="/Home/About?Length=4">About</a>

La partie hidefocus est ce que je voulais réaliser, mais d'où vient la ?Length=4?

287
demandé sur Irvin Dominin 2009-05-05 14:31:14

10 réponses

La longueur = 4 provient d'une tentative de sérialisation d'un objet string. Votre code exécute cette méthode ActionLink:

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

Cela prend un objet string "Home" pour routeValues, que la plomberie MVC recherche pour les propriétés publiques en les transformant en valeurs de route. Dans le cas d'un objet string, la seule propriété publique est Length, et comme il n'y aura pas de routes définies avec un paramètre Length, il ajoute le nom et la valeur de la propriété en tant que paramètre de chaîne de requête. Vous trouverez probablement si vous exécutez ceci à partir d'une page non sur HomeController il va lancer une erreur sur une méthode d'action About manquante. Essayez d'utiliser ce qui suit:

Html.ActionLink("About", "About", new { controller = "Home" }, new { hidefocus = "hidefocus" })
306
répondu roryf 2009-05-06 14:52:28

La façon dont j'ai résolu cela était d'ajouter un null au quatrième paramètre avant la déclaration anonyme (new {}) afin qu'il utilise la surcharge de méthode suivante: (linkText, actionName, controllerName, routeValues, htmlAttributes):

Html.ActionLink("About", "About", "Home", null, new { hidefocus = "hidefocus" })
174
répondu Manuel Castro 2016-08-23 19:34:14

Vous avez oublié d'ajouter le Parm HTMLAttributes.

Cela fonctionnera sans aucun changement:

Html.ActionLink("About", "About", "Home", new { hidefocus = "hidefocus" },null)
82
répondu Jesse Rose 2015-10-05 18:57:07

Les paramètres D'ActionLink ne sont pas corrects, il tente d'utiliser la valeur "Home" comme valeur de route, au lieu du type anonyme.

Je crois que vous avez juste besoin d'ajouter new { } ou null comme le dernier paramètre.

EDIT: relisez simplement le post et réalisez que vous voudrez probablement spécifier null comme avant-dernier paramètre, pas le dernier.

27
répondu 2009-05-05 10:52:32
Html.ActionLink("About", "About", "Home", new { hidefocus = "hidefocus" }, new { })

Cela prendra la surcharge: chaîne linkText, chaîne nomaction, chaîne controllerName, Objet routeValues, Objet htmlAttributes

5
répondu user2254436 2014-06-15 13:48:31

Veuillez utiliser la méthode surchargée droite avec cinq (5) paramètres. Exemple:

@using (@Ajax.BeginForm("Register", "Account", null,
    new AjaxOptions
    {
        HttpMethod = "POST",
        OnSuccess = "OnSuccess",
        OnFailure = "OnFailure",
        OnBegin = "OnBegin",
        OnComplete = "OnComplete"
    }, new { @class = "form-login" }))
3
répondu Omveer singh maurya 2015-12-08 12:25:07

Supprimez simplement "Home" (nom du contrôleur) afin que le code soit:

Html.ActionLink("About", "About", new { hidefocus = "hidefocus" })
2
répondu Fil 2012-05-10 16:08:55

Avec les noms d'attributs:

 @Html.ActionLink(linkText: "SomeText", actionName: "SomeAction", controllerName: "SomeControllerName", routeValues: new { parameterName = parameterValue}, htmlAttributes: null)
1
répondu usefulBee 2015-05-19 17:15:42

Comme Jonathon Watney l'a souligné dans un commentaire, cela vaut aussi pour

Html.BeginForm ()

Méthodes. Dans mon cas, j'étais dans un Create.cshtml ciblant la requête post du contrôleur correspondant + créer une action et avait

using (Html.BeginForm("Create")) {
  @Html.AntiForgeryToken()
  ...
}

Qui ajoutait la chaîne de requête "?Length = 6" à l'action de formulaire lors du rendu. Laissé entendre par la réponse approuvée de roryf et réalisant que la longueur de chaîne de "Create" est 6, j'ai finalement résolu cela en supprimant le spécification d'action explicite:

using (Html.BeginForm()) {
      @Html.AntiForgeryToken()
      ...
    }
0
répondu Frederik Struck-Schøning 2013-11-24 20:33:36

Peut-être que d'autres ont eu le même problème et ont besoin de fournir une valeur class VIA HTMLAttributes parm. Voici ma solution:

@Html.ActionLink("About", "About", new { controller = "Home", area = "" }, new { hidefocus = "hidefocus", @class = "nav-item nav-link" })
0
répondu Taersious 2018-08-09 15:47:40