2011-09-19 3 views
1

j'ai un contrôleur avec une action de postback:Argument passage au contrôleur des actions

[HttpPost] 
public ActionResult test(string x) { ... } 

et je voulais ajouter une action GET avec la même signature:

public ActionResult test(string y) { ... } 

mais le compilateur pukes:

Type 'TestController' already defines a member called 'test' with 
the same parameter types 

donc je pensais changer la signature:

public ActionResult test(RouteValueDictionary args) { ... } 

et l'appeler comme ceci:

@{ 
    RouteValueDictionary args = new RouteValueDictionary(
     new { y = "test" } 
    ); 
} 
@Html.Action("test", "TestController", args) 

mais le contrôleur reçoit args comme nul. De toute évidence, je ne comprends pas comment cela est censé fonctionner. Je sais que je pourrais juste renommer l'action mais j'aimerais savoir comment le déclarer tel que mon dictionnaire se présente.

TIA - e

Répondre

6

Vous pouvez garder la signature et juste changer le nom de la méthode, mais utiliser le même nom d'action en spécifiant le ActionNameAttribute.

Par exemple

[HttpGet] 
public ActionResult Foo(FooModel model) 
{ 
    // do stuff 
} 

[HttpPost] 
[ActionName("Foo")] 
public ActionResult FooPost(FooModel model) 
{ 
    // do stuff 
} 

Les noms de méthodes sont différentes, mais l'action MVC est le même pour les deux: "Foo".

+2

Je préfère ajouter un paramètre 'FormCollection' au modèle de poste s'il s'agit exactement de la même signature afin de ne pas avoir à m'inquiéter des chaînes magiques qui pourraient changer dans le futur :) – Buildstarted

+0

@BuildStarted Abandonner model-binding en raison de cette chaîne semble un choix particulier, à la lumière du fait que les noms d'action sont déjà spécifiés comme des chaînes partout: dans les vues, les redirections, les routes, etc – Jay

+0

Non non, je ne renonce pas - J'ajoute * simplement la FormCollection aux paramètres pour rendre la signature différente :) – Buildstarted

Questions connexes