web-dev-qa-db-fra.com

Razor actionlink à génération automatique? Length = 7 in URL?

J'ai le lien ci-dessous sur une page de rasoir:

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

Il apparaît dans la page source de vue comme indiqué ci-dessous:

<a href="/admin/profile/create?length=7" class="toplink">Create New Profile</a>

Lorsque je clique sur le lien, l'URL est comme ceci:

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

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

55
Pirzada

La substitution ActionLink que vous utilisez correspond à la substitution (chaîne linkText, chaîne actionName, Object routeValues, Object htmlAttributes) . Ainsi, votre valeur "Profile" est passée au paramètre routeValues. Le comportement de cette fonction par rapport à ce paramètre est de prendre toutes les propriétés publiques dessus et de l'ajouter à la liste des valeurs de route utilisées pour générer le lien. Puisqu'un String n'a qu'une seule propriété publique (Length), vous vous retrouvez avec "length = 7".

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

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

Je ne suis pas sûr de la cause exacte de cela, mais changez-le en:

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

Je ne sais pas quelle surcharge MVC choisit lorsque vous laissez le dernier paramètre (htmlattributes est celui ajouté), mais cela le corrigera. Un de ces jours, je vais enquêter et découvrir exactement ce qui se passe.

7
Matt Sieker

Une autre chose à noter, puisque vous définissez le contrôleur dans le @ActionLink, ce que vous n'aurez peut-être pas besoin de faire, par exemple, la vue que votre "Créer un nouveau profil" @ActionLink est exprimé en "/admin/profile/index.cshtml", une vue qui répertorie les profils existants, dans ce cas, vous n'avez pas besoin de définir le contrôleur dans le @ActionLink comme @ActionLink est déjà relatif à 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 c'est plus approprié moi-même. Les surcharges ActionLink ne sont pas la chose la plus simple qui soit.

0
Brian Ogden