web-dev-qa-db-fra.com

Pourquoi Html.ActionLink rend "? Length = 4"

Je suis TRÈS confus quant à pourquoi 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 correspond à ce que je voulais réaliser, mais d'où vient le ?Length=4

291
My Alter Ego

La longueur = 4 provient d'une tentative de sérialisation d'un objet de chaîne. 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, dans lequel la plomberie MVC recherche les propriétés publiques en les transformant en valeurs d'itinéraire. Dans le cas d'un objet string, la seule propriété publique est Length et, comme aucun itinéraire ne sera défini 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 constaterez probablement que si vous exécutez cette opération à partir d'une page qui n'est pas sur HomeController, une erreur sera générée à propos d'une méthode d'action About manquante. Essayez d'utiliser ce qui suit:

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

La façon dont j'ai résolu le problème consistait à ajouter une valeur 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" })
177
Manuel Castro

Vous avez oublié d'ajouter le paramètre HTMLAttributes.

Cela fonctionnera sans aucun changement:

Html.ActionLink("About", "About", "Home", new { hidefocus = "hidefocus" },null)
86
Jesse Rose

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

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

EDIT: Il suffit de relire le message et vous vous rendez compte que vous voudrez probablement spécifier null comme dernier paramètre, et non le dernier.

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

La surcharge sera la suivante:

5
user2254436

Veuillez utiliser la méthode de droite surchargée 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

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

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

Avec noms d'attributs:

 @Html.ActionLink(linkText: "SomeText", actionName: "SomeAction", controllerName: "SomeControllerName", routeValues: new { parameterName = parameterValue}, htmlAttributes: null)
1
usefulBee

Comme Jonathon Watney l’a souligné dans un commentaire, cela vaut également pour 

Html.BeginForm ()

méthodes. Dans mon cas, j'étais dans un Create.cshtml ciblant la demande de publication du contrôleur correspondant + action Créer 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. Repéré par la réponse approuvée de roryf et réalisant que la longueur de chaîne de "Créer" est 6, j'ai finalement résolu ce problème en supprimant la spécification d'action explicite:

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