Ich bin gespannt, 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 das etwas, was nicht geht?
Die aktuelle Anforderung für die Aktion 'MyMethod' für den Controllertyp 'MyController' ist zwischen den folgenden Aktionsmethoden nicht eindeutig:
c#
asp.net-mvc
overloading
Papa Burgund
quelle
quelle
Antworten:
Sie können das Attribut verwenden, wenn Ihr Code überladen werden soll.
Sie müssen jedoch einen anderen Aktionsnamen für dieselbe http-Methode verwenden (wie andere gesagt haben). An diesem Punkt ist es also nur Semantik. Möchten Sie lieber den Namen in Ihrem Code oder Ihrem Attribut haben?
Phil hat einen Artikel dazu: http://haacked.com/archive/2008/08/29/how-a-method-becomes-an-action.aspx
quelle
return View();
. Zum Beispiel :return View("MyOverloadedName");
.Ja. Ich konnte dies tun, indem ich das
HttpGet
/HttpPost
(oder ein gleichwertigesAcceptVerbs
Attribut) für jede Controller-Methode auf etwas Besonderes setzte, dhHttpGet
oderHttpPost
, aber nicht beides. Auf diese Weise kann anhand der Art der Anforderung festgestellt werden, welche Methode verwendet werden soll.Ein Vorschlag, den ich habe, ist, dass für einen Fall wie diesen eine private Implementierung erforderlich ist, auf die sich Ihre beiden öffentlichen Aktionsmethoden stützen, um das Duplizieren von Code zu vermeiden.
quelle
Show()
Methoden unterschiedliche Signaturen haben. Wenn Sie Informationen an die Get-Version senden müssen, erhalten Ihre Get- und Post-Versionen dieselbe Signatur, und Sie benötigen dasActionName
Attribut oder eine der anderen in diesem Beitrag genannten Korrekturen.ActionNameAttribute
. In der Praxis habe ich das selten festgestellt.Hier ist noch etwas, was Sie tun könnten ... Sie möchten eine Methode, die einen Parameter haben kann und nicht.
Warum nicht mal probieren ...
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 nullfähige Syntax für Zeichenfolgen zu entfernen und einen Standardparameterwert zu verwenden.
quelle
string
Kann nicht nullbar sein.)string
nicht sein kannnullable
; aber es kann seinnull
! So oder so habe ich den ersten Kommentar ohne Aufrichtigkeit gepostet.Nein, Nein und Nein. Probieren Sie den folgenden Controller-Code aus, bei dem der "LoadCustomer" überladen ist.
Wenn Sie versuchen, die Aktion "LoadCustomer" aufzurufen, wird eine Fehlermeldung angezeigt (siehe Abbildung unten).
Polymorphismus ist ein Teil der C # -Programmierung, während HTTP ein Protokoll ist. HTTP versteht Polymorphismus nicht. HTTP funktioniert mit dem Konzept oder der URL, und die URL kann nur eindeutige Namen haben. HTTP implementiert also keinen Polymorphismus.
Um dies zu beheben, müssen wir das Attribut "ActionName" verwenden.
Wenn Sie nun die URL "Customer / LoadCustomer" aufrufen, wird die Aktion "LoadCustomer" aufgerufen und mit der URL-Struktur "Customer / LoadCustomerByName" wird der "LoadCustomer (string str)" aufgerufen.
Die obige Antwort habe ich aus diesem Codeprojekt-Artikel entnommen -> MVC- Aktionsüberladung
quelle
Um dieses Problem zu beheben, können Sie eine schreiben
ActionMethodSelectorAttribute
, die dieMethodInfo
für jede Aktion untersucht und mit den angegebenen Formularwerten vergleicht und dann jede Methode ablehnt, für die die Formularwerte nicht übereinstimmen (natürlich ohne den Schaltflächennamen).Hier ein Beispiel: - http://blog.abodit.com/2010/02/asp-net-mvc-ambiguous-match/
ABER das ist keine gute Idee.
quelle
Soweit ich weiß, können Sie dieselbe Methode nur verwenden, wenn Sie verschiedene http-Methoden verwenden.
dh
quelle
[HttpPost]
Attribut anstelle von[AcceptVerbs("POST")]
.Ich habe dies mit Hilfe von Attribute Routing in MVC5 erreicht. Zugegeben, ich bin neu bei MVC und komme aus einem Jahrzehnt der Webentwicklung mit WebForms, aber das Folgende hat für mich funktioniert. Im Gegensatz zur akzeptierten Antwort können hiermit alle überladenen Aktionen von derselben Ansichtsdatei gerendert werden.
Aktivieren Sie zuerst das Attribut-Routing in App_Start / RouteConfig.cs.
Dekorieren Sie Ihre Controller-Klasse optional mit einem Standard-Routenpräfix.
Dekorieren Sie dann Ihre Controller-Aktionen, die sich gegenseitig überlasten, mit einer gemeinsamen Route und entsprechenden Parametern. Mit typbeschränkten Parametern können Sie dasselbe URI-Format mit IDs unterschiedlicher Typen verwenden.
Hoffe das hilft und führt niemanden auf den falschen Weg. :-)
quelle
Sie könnten eine einzige verwenden
ActionResult
, um mit beiden umzugehenPost
undGet
:Nützlich, wenn Ihre
Get
undPost
Methoden übereinstimmende Signaturen haben.quelle
Ich bin gerade auf diese Frage gestoßen und obwohl sie jetzt ziemlich alt ist, ist sie immer noch sehr relevant. Ironischerweise wurde der einzig richtige Kommentar in diesem Thread von einem bekennenden Anfänger in MVC gepostet, als er den Beitrag schrieb. Selbst die ASP.NET-Dokumente sind nicht ganz korrekt. Ich habe ein großes Projekt und überlade erfolgreich Aktionsmethoden.
Wenn man das Routing versteht, kann es über das einfache Standardroutenmuster {controller} / {action} / {id} hinaus offensichtlich sein, dass Controller-Aktionen mit einem beliebigen eindeutigen Muster zugeordnet werden können. Jemand hier sprach über Polymorphismus und sagte: "HTTP versteht Polymorphismus nicht", aber Routing hat nichts mit HTTP zu tun. Es ist einfach ausgedrückt ein Mechanismus für den String-Mustervergleich.
Der beste Weg, um diese Arbeit zu machen, ist die Verwendung der Routing-Attribute, zum Beispiel:
Diese Aktionen kümmern sich um URLs wie
/cars/usa/new-york
und/cars/usa/texas/dallas
, die der ersten bzw. zweiten Indexaktion zugeordnet werden.Bei Betrachtung dieses Beispielcontrollers wird deutlich, dass es über das oben erwähnte Standardroutenmuster hinausgeht. Die Standardeinstellung funktioniert gut, wenn Ihre URL-Struktur genau Ihren Code-Namenskonventionen entspricht. Dies ist jedoch nicht immer der Fall. Code sollte die Domain beschreiben, aber URLs müssen oft noch weiter gehen, da ihr Inhalt auf anderen Kriterien wie SEO-Anforderungen basieren sollte.
Der Vorteil des Standard-Routing-Musters besteht darin, dass automatisch eindeutige Routen erstellt werden. Dies wird vom Compiler erzwungen, da URLs eindeutigen Controller-Typen und -Mitgliedern entsprechen. Das Rollen Ihrer eigenen Routenmuster erfordert sorgfältige Überlegungen, um die Einzigartigkeit sicherzustellen und sicherzustellen, dass sie funktionieren.
Wichtiger Hinweis Der einzige Nachteil ist, dass die Verwendung des Routings zum Generieren von URLs für überladene Aktionen nicht funktioniert, wenn ein Aktionsname verwendet wird, z. B. wenn UrlHelper.Action verwendet wird. Es funktioniert jedoch, wenn benannte Routen verwendet werden, z. B. UrlHelper.RouteUrl. Die Verwendung benannter Routen ist nach Ansicht angesehener Quellen ohnehin der richtige Weg ( http://haacked.com/archive/2010/11/21/named-routes-to-the-rescue.aspx/ ).
Viel Glück!
quelle
Sie können [ActionName ("NewActionName")] verwenden, um dieselbe Methode mit einem anderen Namen zu verwenden:
quelle
Ich brauchte eine Überlastung für:
Es gab nur wenige Argumente, bei denen ich dies getan habe:
Es ist keine perfekte Lösung, besonders wenn Sie viele Argumente haben, aber es funktioniert gut für mich.
quelle
Ich habe das gleiche Problem auch in meiner Bewerbung gesehen. Ohne Änderung der Methodeninformationen habe ich [Aktionsname ("SomeMeaningfulName")]] auf dem Aktionskopf angegeben. Problem gelöst
quelle
Erstellen Sie die Basismethode als virtuell
Erstellen Sie die überschriebene Methode als Überschreibung
Bearbeiten: Dies gilt natürlich nur, wenn sich die Überschreibungsmethode in einer abgeleiteten Klasse befindet, die anscheinend nicht die Absicht des OP war.
quelle
Ich mag diese Antwort in einem anderen Thread
Dies wird hauptsächlich verwendet, wenn Sie von einem anderen Controller erben und eine Aktion vom Basis-Controller überschreiben möchten
ASP.NET MVC - Überschreiben einer Aktion mit unterschiedlichen Parametern
quelle
Für jede Controller-Methode ist nur eine öffentliche Signatur zulässig. Wenn Sie versuchen, es zu überladen, wird es kompiliert, aber Sie erhalten den Laufzeitfehler, den Sie festgestellt haben.
Wenn Sie nicht bereit sind, verschiedene Verben (wie die
[HttpGet]
und[HttpPost]
Attribute) zu verwenden, um überladene Methoden zu unterscheiden (was funktionieren wird) oder das Routing zu ändern, müssen Sie entweder eine andere Methode mit einem anderen Namen angeben oder Sie können Versand innerhalb der bestehenden Methode. So habe ich es gemacht:Ich war einmal in einer Situation, in der ich die Abwärtskompatibilität aufrechterhalten musste. Die ursprüngliche Methode erwartete zwei Parameter, aber die neue hatte nur einen. Das erwartete Überladen funktionierte nicht, da MVC den Einstiegspunkt nicht mehr fand.
Um das zu lösen, habe ich Folgendes getan:
Erstellt eine neue öffentliche Methode, die "nur" 2 Zeichenfolgenparameter enthält. Dieser fungierte als Dispatcher, dh:
Dies ist natürlich ein Hack und sollte später überarbeitet werden. Aber vorerst hat es bei mir funktioniert.
Sie können auch einen Dispatcher erstellen wie:
Sie können sehen, dass UpdateAction zwei Parameter benötigt, während DeleteAction nur einen benötigt.
quelle
Entschuldigung für die Verspätung. Ich hatte das gleiche Problem und fand einen Link mit guten Antworten, könnte das neuen Leuten helfen
Alle Credits für die BinaryIntellect-Website und die Autoren
Grundsätzlich gibt es vier Situationen: Verwenden verschiedener Verben , Routing , Überlastungsmarkierung mit dem Attribut [NoAction] und Ändern des Namens des Aktionsattributs mit [Aktionsname]
Das hängt also von Ihren Anforderungen und Ihrer Situation ab.
Wie auch immer, folgen Sie dem Link:
Link: http://www.binaryintellect.net/articles/8f9d9a8f-7abf-4df6-be8a-9895882ab562.aspx
quelle
Wenn dies ein Versuch ist, eine GET-Aktion für mehrere Ansichten zu verwenden, die zu mehreren Aktionen mit unterschiedlichen Modellen POSTEN, fügen Sie für jede POST-Aktion, die zum ersten GET umleitet, eine GET-Aktion hinzu, um 404 beim Aktualisieren zu verhindern.
Long Shot, aber häufiges Szenario.
quelle