Je suis TRÈS confus quant à la raison pour laquelle ce code
Html.ActionLink("About", "About", "Home", new { hidefocus = "hidefocus" })
donne ce lien:
<a hidefocus="hidefocus" href="/Home/About?Length=4">About</a>
La hidefocus
partie est ce que je visais à réaliser, mais d'où ?Length=4
vient-elle?
asp.net-mvc
My Alter Ego
la source
la source
Réponses:
La longueur = 4 provient d'une tentative de sérialisation d'un objet chaîne. Votre code exécute cette
ActionLink
méthode:Cela prend un
string
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'unstring
objet, la seule propriété publique estLength
, et comme aucun itinéraire n'est défini avec un paramètre Longueur, 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 l'exécutez à partir d'une page qui neHomeController
s'y trouve pas, une erreur sur uneAbout
méthode d'action manquante sera générée. Essayez d'utiliser les éléments suivants:la source
Url.Action()
. Le passage deUrl.Action("Action", "Controller", new { area = "" })
àUrl.Action("Action", new { controller = "Controller", area = "" })
empêche la propriété Length de s'afficher.Html.ActionLink("About", "About", "Home", routeValues: null, htmlAttributes: new { hidefocus = "hidefocus" })
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):la source
controller
etarea
pour empêcher la propriété Length de s'afficher dans l'URL.routeValues
mais uniquement la zone. Par exemple:Html.ActionLink("About", "About", "Home", new {@area = "Admin"}, new { hidefocus = "hidefocus" })
ActionLink
, MVC inclura unLength=x
paramètre étrange à la fin de l'URL. Par exemple, mettez cela sur une page, puis affichez 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 l'controller
entrée dans lerouteValues
, elle ne mettra jamaisLength=x
l'URL.@
dans@area = "Admin"
, juste pour que vous le sachiez.Vous avez oublié d'ajouter le paramètre HTMLAttributes.
Cela fonctionnera sans aucun changement:
la source
Les paramètres d'ActionLink ne sont pas corrects, il essaie d'utiliser la valeur "Home" comme valeur d'itinéraire, au lieu du type anonyme.
Je crois que vous avez juste besoin d'ajouter
new { }
ounull
comme dernier paramètre.EDIT: relisez simplement le message et réalisez que vous voudrez probablement spécifier null comme avant-dernier paramètre, pas le dernier.
la source
Cela prendra la surcharge: string linkText, string actionName, string controllerName, Object routeValues, Object htmlAttributes
la source
Veuillez utiliser la bonne méthode surchargée avec cinq (5) paramètres. Exemple:
la source
Supprimez simplement "Home" (nom du contrôleur) pour que le code soit:
la source
Avec des noms d'attribut:
la source
Comme Jonathon Watney l'a souligné dans un commentaire, cela vaut également pour
méthodes. Dans mon cas, j'étais dans un Create.cshtml ciblant la demande de publication du contrôleur correspondant + l'action Créer et j'avais
qui ajoutait la chaîne de requête "? Longueur = 6" à l'action de formulaire lors du rendu. Insinué 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 la spécification d'action explicite:
la source
Peut-être que d'autres ont eu le même problème et doivent fournir une valeur de classe via HTMLAttributes parm. Voici ma solution:
la source
La recherche d'une réponse à ma question m'a atterri ici, c'est essentiellement la sélection de la surcharge correcte
@Html.ActionLink
qui compte.Je sélectionnais une surcharge qui n'existait pas ( sans la dernière
null
), etMVC
n'avait pas une telle surcharge, résultant en une fausse URL quelque chose comme l'OP mentionné.Une note personnelle : vous pouvez
use
utiliser des types anonymes ne signifie pas que vous pouvez utiliser l'une des surcharges qui n'existent pas? - assurez - vous: il doit être défini!- Entré ici à l'époque de MVC 5.2
la source