341 Stimmen

Können Sie Controller-Methoden in ASP.NET MVC überladen?

Ich bin neugierig zu sehen, ob Sie Controller-Methoden in ASP.NET MVC überladen können. Immer, wenn ich es versuche, erhalte ich den folgenden Fehler. Die beiden Methoden akzeptieren unterschiedliche Argumente. Ist dies etwas, das nicht getan werden kann?

Die aktuelle Anfrage für die Aktion "MyMethod" auf dem Controllertyp "MyController" ist mehrdeutig zwischen den folgenden Aktionsmethoden:

209voto

JD Conley Punkte 2916

Sie können das Attribut verwenden, wenn Sie möchten, dass Ihr Code Überladungen vornimmt.

[ActionName("MyOverloadedName")]

Aber Sie müssen einen anderen Aktionsnamen für dieselbe http-Methode verwenden (wie andere bereits gesagt haben). An diesem Punkt ist es also nur Semantik. Möchten Sie den Namen lieber in Ihrem Code oder in Ihrem Attribut haben?

Phil hat einen Artikel zu diesem Thema: http://haacked.com/archive/2008/08/29/how-a-method-becomes-an-action.aspx

71voto

tvanfosson Punkte 506878

Ja. Ich konnte dies erreichen, indem ich die Option HttpGet / HttpPost (oder gleichwertig) AcceptVerbs Attribut) für jede Controller-Methode auf etwas anderes, d.h., HttpGet o HttpPost , aber nicht beides. Auf diese Weise kann es anhand der Art der Anfrage feststellen, welche Methode zu verwenden ist.

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

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

Ein Vorschlag, den ich für einen Fall wie diesen habe, wäre eine private Implementierung, auf die sich Ihre beiden öffentlichen Aktionsmethoden stützen, um doppelten Code zu vermeiden.

46voto

Farrel Punkte 441

Hier ist etwas anderes, was Sie tun könnten... Sie wollen eine Methode, die in der Lage ist, einen Parameter und nicht haben.

Versuchen Sie doch mal das hier...

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

Das hat bei mir funktioniert... und bei dieser einen Methode können Sie tatsächlich testen, ob Sie den eingehenden Parameter haben.


Aktualisiert, um die ungültige nullable-Syntax für string zu entfernen und einen Standardparameterwert zu verwenden.

24voto

Shivprasad Koirala Punkte 25296

Nein, Nein und Nein. Gehen Sie und versuchen Sie den Controller-Code unten, wo wir die "LoadCustomer" überladen haben.

public class CustomerController : Controller
    {
        //
        // GET: /Customer/

        public ActionResult LoadCustomer()
        {
            return Content("LoadCustomer");
        }
        public ActionResult LoadCustomer(string str)
        {
            return Content("LoadCustomer with a string");
        }
    }

Wenn Sie versuchen, die Aktion "LoadCustomer" aufzurufen, erhalten Sie eine Fehlermeldung wie in der folgenden Abbildung dargestellt.

enter image description here

Polymorphismus ist ein Teil der C#-Programmierung, während HTTP ein Protokoll ist. HTTP versteht keinen Polymorphismus. HTTP arbeitet mit Konzepten oder URLs und URLs können nur eindeutige Namen haben. HTTP implementiert also keinen Polymorphismus.

Um dasselbe zu beheben, müssen wir das Attribut "ActionName" verwenden.

public class CustomerController : Controller
    {
        //
        // GET: /Customer/

        public ActionResult LoadCustomer()
        {
            return Content("LoadCustomer");
        }

        [ActionName("LoadCustomerbyName")]
        public ActionResult LoadCustomer(string str)
        {
            return Content("LoadCustomer with a string");
        }
    }

Wenn Sie nun die URL "Customer/LoadCustomer" aufrufen, wird die Aktion "LoadCustomer" aufgerufen und bei der URL-Struktur "Customer/LoadCustomerByName" wird die Aktion "LoadCustomer(string str)" aufgerufen.

enter image description here

enter image description here

Die obige Antwort habe ich aus diesem Codeproject-Artikel entnommen --> MVC Action-Überladung

15voto

Ian Mercer Punkte 37031

Um dieses Problem zu lösen, müssen Sie peut einen Brief schreiben ActionMethodSelectorAttribute das die MethodInfo für jede Aktion und vergleicht sie mit den Werten des Formulars und lehnt dann jede Methode ab, bei der die Werte des Formulars nicht übereinstimmen (mit Ausnahme des Schaltflächennamens, versteht sich).

Hier ist ein Beispiel:- http://blog.abodit.com/2010/02/asp-net-mvc-ambiguous-match/

ABER, das ist keine gute Idee.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X