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
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" })
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" })
Vous avez oublié d'ajouter le paramètre HTMLAttributes.
Cela fonctionnera sans aucun changement:
Html.ActionLink("About", "About", "Home", new { hidefocus = "hidefocus" },null)
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.
Html.ActionLink("About", "About", "Home", new { hidefocus = "hidefocus" }, new { })
La surcharge sera la suivante:
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" }))
Supprimez simplement "Home" (nom du contrôleur) pour que le code soit:
Html.ActionLink("About", "About", new { hidefocus = "hidefocus" })
Avec noms d'attributs:
@Html.ActionLink(linkText: "SomeText", actionName: "SomeAction", controllerName: "SomeControllerName", routeValues: new { parameterName = parameterValue}, htmlAttributes: null)
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()
...
}