2009-07-17 6 views
13

Alle Beispiele, die ich für das Überladen gesehen habe, haben normalerweise nur zwei Methoden mit dem gleichen Namen mit unterschiedlichen Parametern und eine mit dem GET-Verb, während die andere POST verwendet. Ist es möglich, zwei oder mehr Überladungen auf dieselbe Methode mit demselben Verb durchzuführen?Überladen von asp.net MVC-Controller-Methoden mit demselben Verb?

Hier ist ein Beispiel dessen, was ich bin auf: Can you overload controller methods in ASP.NET MVC?

Antwort

8

Das glaube ich nicht, dass Sie die gleiche Aktionsnamen standardmäßig mit dem ein Verb überlasten. Wie der andere Thread, auf den Sie zeigen, können Sie die Methoden & überladen und dann ein Attribut verwenden, um die Aktion zu ändern, die der Methode zugeordnet ist, aber ich denke, das ist nicht das, wonach Sie suchen.

Eine andere Option, die ich zuvor verwendet habe (hängt davon ab, wie komplex/anders Ihre Überladungen sind) ist einfach Nullwerte für die Parameter & effektiv zu verwenden, um Ihre verschiedenen Signaturen zusammenzuführen. Also statt:

public ActionResult DoSomething(int id)... 
public ActionResult DoSomething(string name)... 

gerade haben:

public ActionResult DoSomething(int? id, string? name) 

nicht die schönste Lösung, aber wenn man Überlastung baut nur auf einem anderen dann ist es nicht so schlimm, ein Kompromiss.

Eine letzte Option, die einen Versuch wert sein kann, geben (ich habe es nicht versuche & weiß nicht einmal, wenn es funktioniert, aber es sollte logisch), ist eine Implementierung der ActionMethodSelectorAttribute zu schreiben, vergleicht die Parameter, die in ControllerContext an die Methodensignatur übergeben werden & versucht, eine beste Übereinstimmung zu machen (dh versuchen, die Ambiguität ein bisschen strenger als die Standardimplementierung aufzulösen).

+0

Das ist ziemlich viel, was ich tue, aber ich schreibe es als öffentlichen ActionResult DoSomething (int? Id, String-Name) und nur eine Überprüfung für String.IsNullOrEmpthy (Name) in der Methode. – Chris

0

Ich denke, es ist nicht. Da ich, dass die MVC-Framework fand wirklich nicht egal, was Sie in der Parameterliste setzen zum Beispiel meiner Handlung ist wie:

public ActionResult Index(int id) {...} 

Es ist in Ordnung ist wie folgt zu erhalten: Domain.com/Index.aspx oder Domain.com/Index.aspx?id=012901 oder sogar Domain.com/Index.aspx?login=938293

Da in Programmiersprache Überlastung bedeutet, dass Sie verschiedene Funktionen auswählen (mit dem gleichen Namen) mit dem Eingang Parameter, aber MVC in diesem Fall war es egal! Also außer ActionVerb überladen, ich denke es ist nicht ok.

+0

Ja, aber ich glaube, dass es wegen Ihrer URL-Syntax ist, wo ich {Controller}/{Action}/{ID} Syntax verwende. – 4thSpace

+0

Ich habe nicht die Syntax wie Ihre getestet, um Überladung zu testen, aber es klingt, es ist immer noch nicht möglich, da ASP.net MVC immer noch die ID (Parameter) als Zeichenfolge behandelt und es an die Aktion übergeben (möglicherweise versuchen, es zu tippen) wenn die Aktion nur int akzeptiert, aber in diesem Fall kann ein Fehler auftreten, wenn die ID nicht ganzzahlig ist) – xandy