Pourquoi ne Html.Rendu ActionLink"?Longueur = 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="/Home/About?Length=4">About</a>
La partie hidefocus
est ce que je voulais réaliser, mais d'où vient la ?Length=4
?
10 réponses
La longueur = 4 provient d'une tentative de sérialisation d'un objet string. 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, que la plomberie MVC recherche 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 il n'y aura pas de routes définies 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 trouverez probablement 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 ce qui suit:
Html.ActionLink("About", "About", new { controller = "Home" }, 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):
Html.ActionLink("About", "About", "Home", null, new { hidefocus = "hidefocus" })
Vous avez oublié d'ajouter le Parm 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 "Home" comme valeur de route, au lieu du type anonyme.
Je crois que vous avez juste besoin d'ajouter new { }
ou null
comme le dernier paramètre.
EDIT: relisez simplement le post et réalisez que vous voudrez probablement spécifier null comme avant-dernier paramètre, pas le dernier.
Html.ActionLink("About", "About", "Home", new { hidefocus = "hidefocus" }, new { })
Cela prendra la surcharge: chaîne linkText, chaîne nomaction, chaîne controllerName, Objet routeValues, Objet htmlAttributes
Veuillez utiliser la méthode surchargée droite 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) afin que le code soit:
Html.ActionLink("About", "About", new { hidefocus = "hidefocus" })
Avec les 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 aussi pour
Html.BeginForm ()
Méthodes. Dans mon cas, j'étais dans un Create.cshtml ciblant la requête post du contrôleur correspondant + créer une action 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. Laissé entendre 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 le spécification d'action explicite:
using (Html.BeginForm()) {
@Html.AntiForgeryToken()
...
}
Peut-être que d'autres ont eu le même problème et ont besoin de fournir une valeur class VIA HTMLAttributes parm. Voici ma solution:
@Html.ActionLink("About", "About", new { controller = "Home", area = "" }, new { hidefocus = "hidefocus", @class = "nav-item nav-link" })