2009-05-05 6 views
271

Je suis très confus pour expliquer pourquoi ce codePourquoi est-ce Html.ActionLink rendre

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

de ce lien "Longueur = 4?":

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

La partie hidefocus est ce que je visait à atteindre, mais d'où vient les ?Length=4?

+2

Ce comportement apparaît également avec les méthodes Html.BeginForm(). –

+3

Cela m'a rendu fou pendant une grande partie de la journée. Je suis massivement soulagé. – 5arx

Répondre

292

La longueur = 4 provient d'une tentative de sérialisation d'un objet chaîne. Votre code est en cours d'exécution de 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 les recherches de plomberie MVC 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 aucune route n'est définie avec un paramètre Length, elle ajoute le nom et la valeur de la propriété en tant que paramètre de chaîne de requête. Vous trouverez probablement que 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 les éléments suivants:

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

voir la réponse par @jesse ci-dessous, il a une meilleure solution (IMHO) ... – THBBFT

+0

@Blah_Blah ces jours je ne l'utilise pas du tout, préfèrent écrire mes propres tags et en utilisant simplement Url.Action ("Action" , "Contrôleur") – roryf

+0

@roryf pas de soucis ... cela a été utilisé dans une revue de code comme une des meilleures pratiques, ils n'ont pas vérifié la date. Il devrait vraiment y avoir un moyen de filtrer le stackoverflow par date ... – THBBFT

24

Les paramètres d'ActionLink ne sont pas corrects. Ils tentent 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 dernier paramètre.

EDIT: Il suffit de relire le message et réalisé que vous aurez probablement besoin de spécifier null comme deuxième dernier paramètre, pas le dernier.

+8

IMHO C'est SOOOO terrifiant agaçant. Ça m'arrive 10 fois par jour. – Jabe

+0

Parlez-moi de ça. –

+1

BTW Ils devraient supprimer une méthode car il n'est pas possible de l'utiliser! –

158

La façon dont je résolu ce problème est ajoutait une valeur nulle 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" }) 
+12

c'est la meilleure réponse pour cela .. et devrait être marqué comme la réponse. – MoXplod

+0

même pour moi, merci –

+0

Ceci est la meilleure réponse si vous ne faites pas de liens entre les zones. Si vous devez spécifier la zone pour le lien, vous devez spécifier les valeurs de route avec 'controller' et' area' pour empêcher la propriété Length d'apparaître dans l'URL. –

2

enlèverait juste "Home" (nom du contrôleur) afin que le code serait:

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

Vous avez oublié d'ajouter la HTMLAttributes parm.

Cela fonctionnera sans aucun changement:

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

Merci Jesse Rose, ça m'a aidé !! –

+1

+1 pour celui-ci fonctionne réellement pour moi! Merci! –

+0

C'est ce qui a fonctionné pour moi –

0

Comme Jonathon Watney a fait remarquer dans un commentaire, cela va aussi pour

Html.BeginForm()

méthodes. Dans mon cas, j'étais dans un Create.cshtml ciblant la demande de poste de commande correspondant + Créer une action et a

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

qui ajoutait la querystring « ? Longueur = 6 » à l'action de forme lorsqu'il est rendu.Insinué par roryf est approuvé réponse et la réalisation de la longueur de la chaîne de « Créer » est 6, je me suis finalement résolu ce problème en supprimant la spécification d'action explicite:

using (Html.BeginForm()) { 
     @Html.AntiForgeryToken() 
     ... 
    } 
5
Html.ActionLink("About", "About", "Home", new { hidefocus = "hidefocus" }, new { }) 

Cela prendra la surcharge: chaîne linkText, chaîne actionName , chaîne ControllerName, routeValues ​​d'objets, d'objets htmlAttributes

0

Avec des noms d'attributs:

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

utiliser Veuillez meth surcharge droit od 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" })) 
+0

en ajoutant ** null ** après le nom du contrôleur a été utile dans mon cas. –

+0

C'est effectivement la même réponse que la réponse de @ Jesse avec le bonus supplémentaire qu'elle couvre la version Ajax, ce qui n'est pas ce que l'OP a demandé, mais c'est lié au même problème. – gcoulby

Questions connexes