321 votes

Pourquoi Html.ActionLink rend-il "?Length=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="stackoverflow.com/Home/About?Length=4">About</a>

El hidefocus est ce que je cherchais à atteindre, mais où se trouve la partie ?Length=4 proviennent-ils ?

4 votes

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

344voto

roryf Points 14520

La longueur=4 provient d'une tentative de sérialisation d'un objet chaîne. Votre code s'exécute comme suit ActionLink méthode :

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

Cela prend un string L'objet "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 string la seule propriété publique est Length et, comme aucune route ne sera définie avec un paramètre de longueur, il ajoute le nom et la valeur de la propriété comme paramètre de chaîne de requête. Vous trouverez probablement que si vous exécutez ceci à partir d'une page qui n'est pas sur le site de HomeController il lancera une erreur à propos d'un manquant About méthode d'action. Essayez d'utiliser ce qui suit :

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

0 votes

@Blah_Blah ces jours-ci, je n'utilise pas du tout cette fonction, je préfère écrire mes propres balises <a> et utiliser simplement Url.Action("Action", "Controller")

0 votes

@roryf pas de soucis ... ceci a été utilisé dans une revue de code comme une meilleure pratique, ils n'ont pas vérifié la date. Il devrait vraiment y avoir un moyen de filtrer le stackoverflow par date ...

1 votes

Excellente réponse. J'ajoute que cela se produit également avec Html.BeginRouteForm pour la même raison. Html.BeginRouteForm("Route", "Action", FormMethod.Post)) Devrait être Html.BeginRouteForm("Route", new{ action = "AgentSignUp"}, FormMethod.Post) qui se débarrasse du problème de longueur bizarre.

200voto

Manuel Castro Points 923

La façon dont j'ai résolu ce problème est 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" })

0 votes

C'est la meilleure réponse si vous ne créez pas de lien entre des zones. Si vous avez besoin de spécifier la zone pour le lien, vous devez spécifier les routeValues avec la balise controller et le area pour éviter que la propriété Length n'apparaisse dans l'URL.

0 votes

@JohnWasham En fait, il n'est pas nécessaire de spécifier le contrôleur dans la balise routeValues mais seulement la zone. Par exemple : Html.ActionLink("About", "About", "Home", new {@area = "Admin"}, new { hidefocus = "hidefocus" })

1 votes

@epiplon, la raison pour laquelle j'ai spécifié le contrôleur de cette manière est que si vous n'incluez pas htmlAttributes comme dernier argument de la commande ActionLink MVC comprendra un étrange Length=x à la fin de l'URL. Par exemple, mettez ceci sur une page, puis regardez la source de votre page, et vous verrez ce que je veux dire : @Html.ActionLink("About", "About", "Home", new { area = "Admin" }, new { hidefocus = "hidefocus" }) @Html.ActionLink("About", "About", "Home", new { area = "Admin" }) Mais si vous mettez le controller l'entrée dans la routeValues il ne mettra jamais Length=x dans l'URL.

90voto

Jesse Rose Points 221

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

Cela fonctionnera sans aucune modification :

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

0 votes

Je ne sais pas pourquoi cela ne fonctionne pas pour moi. J'ai essayé avec "new{hidefocus=""}", et cela fonctionne pour moi.

29voto

Les paramètres de l'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 { } o null comme dernier paramètre.

EDIT : Je viens de relire le message et j'ai réalisé que vous voudrez probablement spécifier null comme l'avant-dernier paramètre, et non le dernier.

5voto

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

Ceci prendra la surcharge : string linkText, string actionName, string controllerName, Object routeValues, Object htmlAttributes

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X