337 votes

Pouvez-vous la surcharge de méthodes de contrôleur dans ASP.Net MVC?

Im curieux de voir si vous pouvez la surcharge de méthodes de contrôleur dans ASP.Net MVC. Chaque fois que j'essaie, j'obtiens l'erreur ci-dessous. Les deux méthodes d'accepter les différents arguments. Est-ce quelque chose qui ne peut pas être fait?

La demande actuelle de l'action "MyMethod" sur le contrôleur de type 'MyController" est ambigu entre l'action suivante méthodes:

206voto

JD Conley Points 1848

Vous pouvez utiliser l'attribut si vous voulez que votre code ne surcharge.

[ActionName("MyOverloadedName")]

Mais, vous devrez utiliser un autre nom de l'action pour la même méthode http (comme d'autres l'ont dit). Donc, c'est juste de la sémantique à ce point. Préférez-vous le nom de votre code ou votre attribut?

Phil a un article à ce: http://haacked.com/archive/2008/08/29/how-a-method-becomes-an-action.aspx

70voto

tvanfosson Points 268301

Oui. J'ai été en mesure de le faire en mettant l' HttpGet/HttpPost (ou l'équivalent AcceptVerbs d'attribut) pour chaque méthode de contrôleur pour quelque chose de distinct, à savoir, HttpGet ou HttpPost, mais pas les deux. De cette façon, il peut dire en fonction du type de demande de la méthode à utiliser.

[HttpGet]
public ActionResult Show()
{
   ...
}

[HttpPost]
public ActionResult Show( string userName )
{
   ...
}

Une suggestion que j'ai est que, pour un cas de ce genre, serait privé de la mise en œuvre que les deux de vos méthodes d'Action dépendent pour éviter la duplication de code.

44voto

Farrel Points 231

Voici quelque chose que vous pourriez faire... vous voulez une méthode qui est capable d'avoir un paramètre et non.

Pourquoi ne pas essayer cette...

public ActionResult Show( string username = null )
{
   ...
}

Ce qui a fonctionné pour moi... et dans cette méthode, vous pouvez réellement tester pour voir si vous avez le paramètre entrant.


Mise à jour pour supprimer les invalides nullable de la syntaxe de chaîne et d'utiliser une valeur de paramètre par défaut.

15voto

Ian Mercer Points 19271

Pour surmonter ce problème, vous pouvez écrire un ActionMethodSelectorAttribute qui examine l' MethodInfo pour chaque action, et la compare à la publication des valeurs d'un Formulaire et rejette ensuite l'une des méthodes de laquelle le formulaire de valeurs ne correspondent pas (à l'exclusion du nom du bouton, bien sûr).

Voici un exemple:- http://blog.abodit.com/2010/02/asp-net-mvc-ambiguous-match/

MAIS, ce n'est pas une bonne idée.

14voto

keeney Points 434

Comme je sais que vous ne pouvez avoir la même méthode lors de l'utilisation de différentes méthodes http.

c'est à dire

[AcceptVerbs("GET")]
public ActionResult MyAction()
{

}

[AcceptVerbs("POST")]
public ActionResult MyAction(FormResult fm)
{

}

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