53

J'ai lien sur la page de rasoir ci-dessous.Razor actionlink autogenerating? Longueur = 7 dans l'URL?

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

Je vois vue page qui est en dessous

<a href="/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? Longueur = 7. Pourquoi cela est généré automatiquement.

+0

cela doit être quelque chose à voir avec vos itinéraires. Par défaut, ce 'ActionLink' devrait générer un href de'/Profile/Create'. Où 'Profile' est l'argument controller, et' Create' est l'argument de la méthode d'action. Le fait que '/ admin' soit placé dans le href met en évidence ce problème. pouvez-vous montrer vos itinéraires? – RPM1984

Répondre

85

Le remplacement ActionLink vous utilisez des correspondances à l'override (string linkText, string actionName, Object routeValues, Object htmlAttributes). Votre valeur "Profile" est donc transmise au paramètre routeValues. Le comportement de cette fonction par rapport à ce paramètre consiste à y placer toutes les propriétés publiques et à les ajouter à la liste des valeurs de route utilisées pour générer le lien. Comme une chaîne n'a qu'une seule propriété publique (Longueur), vous obtenez "longueur = 7".

La surcharge correcte à utiliser est le (string linkText, string actionName, string controllerName, Object routeValues, Object htmlAttributes) et vous l'appelez Loke donc:

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

Pouvez-vous clarifier pour moi ... en utilisant cette structure, mon lien génère comme '~/Account/Manage /' ... Je devais mettre le 'new {}' vide 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 à y arriver et je ne comprends pas pourquoi – Ortund

+0

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

7

Je ne suis pas sûr que la cause exacte de cela, mais changer pour:

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

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

+0

Ce genre de travaillé pour moi, mais je me suis quand même fini avec un lien bum ... J'ai '~/Account/Manage/user = ortund' alors que ce dont j'ai besoin est' ~/Account/Manage/ortund' – Ortund

+0

Vous pouvez utilisez juste null. Au moins c'est ce que j'utilise toujours. –

0

Une autre chose à noter, puisque vous définissez le contrôleur dans le @ActionLink, que vous ne pouvez pas besoin de faire Par exemple, l'affichage de votre "Créer un nouveau profil" @ActionLink peut être "/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 le @ActionLink est déjà relatif au , donc votre @ActionLink pourrait être

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

J'utilisé null au lieu de new{} comme ne répond marquée, je pense que cela est moi-même plus approprié. Les surcharges d'ActionLink ne sont pas les choses les plus simples.