webentwicklung-frage-antwort-db.com.de

post und mit derselben Methodensignatur bekommen

In meinem Controller gibt es zwei Aktionen, die "Freunde" genannt werden. Die Ausführung, die ausgeführt wird, hängt davon ab, ob es sich um ein "Abrufen" gegenüber einem "Post" handelt.

Meine Code-Schnipsel sehen also ungefähr so ​​aus:

// Get:
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Friends()
{
    // do some stuff
    return View();
}

// Post:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Friends()
{
    // do some stuff
    return View();
}

Dies wird jedoch nicht kompiliert, da ich zwei Methoden mit derselben Signatur (Freunde) habe. Wie gehe ich damit um? Muss ich nur eine Aktion erstellen, aber zwischen "get" und "post" darin unterscheiden? Wenn ja, wie mache ich das?

51
codette

Benennen Sie die zweite Methode in etwas anderes wie "Friends_Post" um, und Sie können dem zweiten Attribut [ActionName("Friends")] hinzufügen. Daher werden die Anforderungen an die Friend-Aktion mit POST als Anforderungstyp von dieser Aktion behandelt.

// Get:
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Friends()
{
    // do some stuff
    return View();
}

// Post:
[ActionName("Friends")]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Friends_Post()
{
    // do some stuff
    return View();
}
113
Çağdaş Tekin

Wenn Sie wirklich nur eine Routine für beide Verben benötigen, versuchen Sie Folgendes:

[AcceptVerbs("Get", "Post")]
public ActionResult ActionName(string param1, ...)
{
//Fun stuff goes here.
}

Ein möglicher Nachteil: Ich verwende MVC Version 2. Ich bin mir nicht sicher, ob dies in MVC 1 unterstützt wurde.

20
mohrtan

Versuchen Sie es mit:

[AcceptVerbs(HttpVerbs.Post | HttpVerbs.Get)]
public ActionResult Friends()
{
    // do some stuff
    return View();
}
6
KateA

Die Antwort von cagdas als Antwort markieren, da sie meine Frage beantwortet hat. Da ich jedoch das ActionName-Attribut in meinem Projekt nicht mag, verwende ich eine andere Lösung. Ich habe einfach die FormCollection zur "post" -Aktion hinzugefügt (die die Methodensignatur ändert)

// Get:
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Friends()
{
    // do some stuff
    return View();
}

// Post:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Friends(FormCollection form)
{
    // do some stuff
    return View();
}
2
codette

ich bin nicht ganz sicher, ob es der richtige Weg ist, aber ich würde einen sinnlosen Parameter verwenden, um die Sigs zu unterscheiden. mögen:

// Get:
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Friends(bool isGet)
{
    // do some stuff
    return View();
}

// Post:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Friends()
{
    // do some stuff
    return View();
}

Ich weiß, dass es hässlich und hackig ist, aber es funktioniert.

2
Ariel

fügen Sie der Post-Methode die Parameter hinzu, die Sie in der Post erhalten möchten. vielleicht so:

// Post:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Friends(string friendName, string otherField)
{
    // do some stuff
    return View();
}

..oder wenn Sie einen komplexen Typ haben, wie folgt:

// Post:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Friends(Friend friend)
{
    // do some stuff
    return View();
}

Bearbeiten: Es ist vorzuziehen, einen typisierten Ansatz für den Erhalt der gebuchten Artikel zu verwenden, wie oben.

1
Matt Kocaj

Ihre Aktionsmethoden können nicht dasselbe tun, sonst müssen Sie nicht zwei Aktionsmethoden schreiben. Wenn also die Semantik unterschiedlich ist, warum sollten nicht auch andere Namen für die Aktionsmethoden verwendet werden? 

Wenn Sie beispielsweise eine Aktionsmethode "delete" hatten und GET nur eine Bestätigung verlangt, können Sie die GET-Methode "ConfirmDelete" und die Methode POST nur "Delete" aufrufen. 

Ich bin mir nicht sicher, ob das zu Ihrem Szenario passt, aber es war immer bei mir, wenn ich das gleiche Problem hatte. 

0
Adrian Grigore