56 votes

Le lien d'action Razor génère automatiquement ?length=7 dans l'URL ?

J'ai un lien sur la page du rasoir ci-dessous.

@Html.ActionLink("Create New Profile", "Create", "Profile", new { @class="toplink" })

Je vois la source de la vue de la page qui est ci-dessous

<a href="http://stackoverflow.com/admin/profile/create?length=7" class="toplink">Create New Profile</a>

Lorsque je clique sur le lien. L'URL est comme ci-dessous.

http://localhost:54876/admin/profile/create?length=7

Je ne veux pas de ?length=7. Pourquoi cela est généré automatiquement.

0 votes

Ça doit être quelque chose à voir avec vos itinéraires. Par défaut, cela ActionLink devrait générer un href de /Profile/Create . Où Profile est l'argument du contrôleur, et Create est l'argument de la méthode d'action. Le fait que /admin est mis dans les reflets met en évidence cette question. pouvez-vous montrer vos itinéraires ?

0 votes

Vous utilisez peut-être le mauvais surcharge

89voto

marcind Points 38002

Le site ActionLink que vous utilisez correspond à l'option (string linkText, string actionName, Object routeValues, Object htmlAttributes) de remplacement. Ainsi, la valeur de votre "Profil" est transmise à la fonction routeValues paramètre. Le comportement de cette fonction par rapport à ce paramètre est de prendre toutes les propriétés publiques de celui-ci et de les ajouter à la liste des valeurs de route utilisées pour générer le lien. Étant donné qu'une chaîne de caractères ne possède qu'une seule propriété publique (Length), vous obtenez "length=7".

La surcharge correcte que vous voulez utiliser est la surcharge (string linkText, string actionName, string controllerName, Object routeValues, Object htmlAttributes) et vous l'appelez ainsi :

@Html.ActionLink("Create New Profile", "Create", "Profile", new {}, new { @class="toplink"})

0 votes

Pouvez-vous clarifier pour moi... en utilisant cette structure, mon lien génère comme ~/Account/Manage/ ... J'ai dû mettre le vide new { } après mon paramètre, mais maintenant il génère comme ~/Account/Manage/user=ortund alors que je veux ~/Account/Manage/ortund ... Je n'arrive pas à m'y rendre et je ne comprends pas pourquoi.

1 votes

Le plus drôle, c'est que le bolierplate MVC officiel utilise mal cette surcharge par défaut lors de la création d'un lien "Mot de passe oublié". J'ai dû le changer.

0 votes

Faits intéressants :)

7voto

Matt Sieker Points 3166

Je ne suis pas sûr de la cause exacte de ce problème, mais changez-le en :

@Html.ActionLink("Create New Profile", "Create", "Profile", new { @class="toplink" }, new {})

Je ne sais pas quelle surcharge MVC choisit lorsque vous omettez le dernier paramètre ( htmlattributes est celui qui a été ajouté), mais cela va régler le problème. Un de ces jours, je vais enquêter et comprendre exactement ce qui se passe.

0 votes

Cela a en quelque sorte fonctionné pour moi, mais je me suis quand même retrouvé avec un lien défectueux... J'ai obtenu ~/Account/Manage/user=ortund alors que ce dont j'ai besoin est ~/Account/Manage/ortund

0 votes

Vous pouvez simplement utiliser null. En tout cas, c'est ce que j'utilise toujours.

1voto

Brian Ogden Points 1954

Une autre chose à noter, puisque vous définissez le contrôleur dans la section @ActionLink ce que vous n'avez peut-être pas besoin de faire, par exemple, l'affichage que votre "Créer un nouveau profil". @ActionLink peut être "/admin/profile/index.cshtml", une vue qui répertorie les profils existants. Dans ce cas, il n'est pas nécessaire de définir le contrôleur dans le fichier @ActionLink comme le @ActionLink est déjà relative à la ProfileController donc votre @ActionLink pourrait être

@Html.ActionLink("Create New Profile", "Create", null, new { @class="toplink" })

J'ai utilisé null au lieu de new{} comme le fait la réponse marquée, je pense que ceci est plus approprié moi-même. Les surcharges ActionLink ne sont pas la chose la plus simple qui soit.

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