it-swarm.com.de

GET und POST Methoden mit demselben Action-Namen im selben Controller

Warum ist das falsch?

{
    public class HomeController : Controller
    {

        [HttpGet]
        public ActionResult Index()
        {
            Some Code--Some Code---Some Code
            return View();
        }

        [HttpPost]
        public ActionResult Index()
        {
            Some Code--Some Code---Some Code
            return View();
        }

    }

Wie kann ich einen Controller haben, der eine Antwort gibt, wenn "Getter" ist und wann "gepostet" wird?

72
Ricardo Polo

Da Sie nicht zwei Methoden mit demselben Namen und derselben Signatur haben können, müssen Sie das Attribut ActionName verwenden:

    [HttpGet]
    public ActionResult Index()
    {
        Some Code--Some Code---Some Code
        return View();
    }

    [HttpPost]
    [ActionName("Index")]
    public ActionResult IndexPost()
    {
        Some Code--Some Code---Some Code
        return View();
    }

Siehe auch "Wie aus einer Methode eine Aktion wird"

151
BrokenGlass

Mit ASP.NET MVC können Sie zwei Aktionen mit demselben Namen ausführen. In .NET können Sie jedoch nicht zwei Methoden mit derselben Signatur verwenden, d. H. Denselben Namen und dieselben Parameter.

Sie müssen die Methoden anders benennen. Verwenden Sie das ActionName-Attribut, um ASP.NET MVC mitzuteilen, dass sie tatsächlich dieselbe Aktion sind.

Wenn Sie jedoch von einem GET und einem POST sprechen, wird dieses Problem wahrscheinlich verschwinden, da die Aktion POST mehr Parameter als der GET benötigt und daher unterscheidbar ist.

Also brauchst du entweder:

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

[HttpPost, ActionName("ActionName")]
public ActionResult ActionNamePost() {...}

Oder,

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

[HttpPost]
public ActionResult ActionName(string aParameter) {...}
35
user1082916

Ich akzeptiere gerne einen Formularposten für meine POST - Aktionen, auch wenn ich sie nicht brauche. Für mich ist es einfach das Richtige zu tun, weil Sie angeblichetwasposten.

public class HomeController : Controller
{
    public ActionResult Index()
    {
        //Code...
        return View();
    }

    [HttpPost]
    public ActionResult Index(FormCollection form)
    {
        //Code...
        return View();
    }
}
16
jocull

Um Ihre spezifische Frage zu beantworten, können Sie nicht zwei Methoden mit demselben Namen und denselben Argumenten in einer einzelnen Klasse haben. Die Verwendung der Attribute HttpGet und HttpPost unterscheidet die Methoden nicht.

Um dies zu beheben, füge ich normalerweise das Ansichtsmodell für das von Ihnen gepostete Formular hinzu:

public class HomeController : Controller
{
    [HttpGet]
    public ActionResult Index()
    {
        Some Code--Some Code---Some Code
        return View();
    }

    [HttpPost]
    public ActionResult Index(formViewModel model)
    {
        do work on model --
        return View();
    }

}
5
Jeff Siver

Es können nicht mehrere Aktionen mit demselben Namen und demselben Parameter ausgeführt werden

    [HttpGet]
    public ActionResult Index()
    {
        return View();
    }
    [HttpPost]
    public ActionResult Index(int id)
    {
        return View();
    }

obwohl int id nicht verwendet wird

2
Mason

Sie können nicht mehrere Aktionen mit demselben Namen haben. Sie können einer Methode einen Parameter hinzufügen, und das wäre gültig. Zum Beispiel:

    public ActionResult Index(int i)
    {
        Some Code--Some Code---Some Code
        return View();
    }

Es gibt verschiedene Möglichkeiten, um Aktionen auszuführen, die sich nur durch das Anforderungsverb unterscheiden. Mein Favorit und, ich denke, am einfachsten zu implementieren, ist die Verwendung des Pakets AttributeRouting . Nach der Installation fügen Sie Ihrer Methode einfach ein Attribut wie folgt hinzu:

  [GET("Resources")]
  public ActionResult Index()
  {
      return View();
  }

  [POST("Resources")]
  public ActionResult Create()
  {
      return RedirectToAction("Index");
  }

Im obigen Beispiel haben die Methoden unterschiedliche Namen, aber der Aktionsname ist in beiden Fällen "Resources". Der einzige Unterschied ist das Anforderungsverb.

Das Paket kann mit NuGet folgendermaßen installiert werden:

PM> Install-Package AttributeRouting 

Wenn Sie die Abhängigkeit von den AttributeRouting-Paketen nicht wünschen, können Sie dies tun, indem Sie ein benutzerdefiniertes Aktionsselektorattribut schreiben.

2
Mark

Sie haben die gute Antwort auf diese Frage erhalten, aber ich möchte meine zwei Cents hinzufügen. Sie können eine Methode verwenden und Anforderungen entsprechend dem Anforderungstyp bearbeiten:

public ActionResult Index()
{
    if("GET"==this.HttpContext.Request.RequestType)
    {
        Some Code--Some Code---Some Code for GET
    }
    else if("POST"==this.HttpContext.Request.RequestType)
    {
        Some Code--Some Code---Some Code for POST
    }
    else
    {
        //exception
    }

    return View();
}
1
RredCat

Heute habe ich einige Ressourcen zu derselben Frage geprüft und ein interessantes Beispiel dafür bekommen.

Es ist möglich, dieselbe Methode per GET und POST - Protokoll aufzurufen, aber Sie müssen die Parameter folgendermaßen überladen:

@using (Ajax.BeginForm("Index", "MyController", ajaxOptions, new { @id = "form-consulta" }))
{
//code
}

Die Aktion:

[ActionName("Index")]
public async Task<ActionResult> IndexAsync(MyModel model)
{
//code
}

Standardmäßig ist eine Methode ohne explizites Protokoll GET. In diesem Fall gibt es jedoch einen deklarierten Parameter, mit dem die Methode wie ein POST arbeitet.

Wenn GET ausgeführt wird, spielt der Parameter keine Rolle, aber wenn POST ausgeführt wird, ist der Parameter für Ihre Anforderung erforderlich.

0
Moacir