2010-01-08 4 views
30

En utilisant l'itinéraire par défaut fourni, je suis forcé de nommer mes paramètres "id". C'est bien pour beaucoup de mes actions de contrôleur, mais je veux utiliser une meilleure dénomination des variables dans certains endroits. Y a-t-il une sorte d'attribut que je peux utiliser pour que je puisse avoir des noms de variables plus significatifs dans mes signatures d'actions?Nommage des paramètres d'action

// Default Route: 
routes.MapRoute(
    "Default",            // Route name 
    "{controller}/{action}/{id}",       // URL with parameters 
    new { controller = "Home", action = "Index", id = "" } // Parameter defaults 
); 

// Action Signature: 
public ActionResult ByAlias(string alias) 
{ 
    // Because the route specifies "id" and this action takes an "alias", nothing is bound 
} 

Répondre

48

Utilisez les touches [Bind] attribut:

public ActionResult ByAlias([Bind(Prefix = "id")] string alias) { 
    // your code here 
} 
+1

C'est le meilleur exemple d'utilisation de Bind que j'ai encore trouvé! Y at-il un moyen de faire aussi ce travail sur les propriétés du modèle? c'est-à-dire qu'à la place de la signature de la méthode ayant un paramètre string, elle a une classe en paramètre qui a une propriété qui ressemble à ceci: '[Bind (Prefix =" id ")] string Alias ​​{get; définir;} '? Cet exemple ne compile pas ... comment pourrais-je le modifier pour compiler (et aussi travailler)? –

0

Cela fonctionne encore, votre chaîne de requête va simplement ressembler à "/ contrôleur/ByAlias? Alias ​​= quelque chose".

+0

Je suppose que vous dites ça marche encore un sens si je l'avais réellement utilisé Html.ActionLink à créer mon lien, alors il créerait une URL comme vous l'avez décrit ... et si je ne le faisais pas et que j'appuyais juste sur l'URL/Controller/ByAlias ​​/ aliashere - puis-je lier le paramètre alias de la chaîne au " id "pièce définie dans la route? – Langdon

+0

Sur ma version MVC, cela n'a pas fonctionné. Il est strictement attendu/{id} - ne peut pas fournir? Alias ​​= val – mmcrae

0

Vous pouvez personnaliser les routes avec tout ce que vous aimez .. identifiants

routes.MapRoute(
    "Default",            // Route name 
    "{controller}/{action}/{alias}",       // URL with parameters 
    new { controller = "Home", action = "Index", alias = "" } // Parameter defaults 
); 

Edit:Here's an overview from the ASP.NET site

+0

Je peux, mais si je veux toujours l'original/Home/Index/id pour travailler, je ne peux pas très bien définir/Home/Index/alias droite après et attendez-vous à être frappé. – Langdon

0

Tout simplement parce que votre itinéraire utilise le nom "id" pour la variable ID ne signifie pas que vous devez utiliser le même nom dans vos méthodes d'action de contrôleur.

Par exemple, étant donné cette méthode de commande ...

public Controller MailerController 
{ 
    public ActionResult Details(int mailerID) 
    { 
     ... 
     return View(new { id = mailerID }); 
    } 
} 

... et cette méthode appel d'action de la vue ...

<%= Html.ActionLink("More Info", "Details", new { mailerID = 7 }) %> 

... vous pouvez utiliser tout nommage convention que vous souhaitez pour le paramètre ID dans vos méthodes d'action de contrôleur. Tout ce que vous devez faire est de résoudre le nouveau nom par défaut, que ce soit "id", "alias", ou autre chose.

L'exemple ci-dessus devrait se résoudre à:

<a href="/Mailer/Details/7">More Info</a> 
+2

Pour moi (en MVC 1.0) mailerID se traduira toujours par null si je clique sur/Mailer/Details/7. Dès que je change int mailerID à int id (selon la Route) cela fonctionne très bien. – Langdon

+3

L'utilisation de 'id' vous permet de généraliser vos routes. Sans cela, vous auriez besoin d'un itinéraire pour chaque variation de nom de l'ID. –