2016-04-13 7 views
1

Das schien mir so einfach, aber ich vermisse das Boot.MVC 6 Web Api Doppelter http Aktionen (Post)

Ich habe einen Controller, der zwei verschiedene Arten von POST-Aktionen behandelt.

[HttpPost("")] 
public JsonResult Post([FromBody]Category mdl) 
{ ... snip... } 


[HttpPost("")] 
public JsonResult Post([FromBody]SubCategory mdl) 
{ ... snip... } 

Der einzige Unterschied ist der Objektparameter in der Signatur. Anfangs dachte ich, das würde ausreichen, dass MVC in der Lage wäre zu unterscheiden, aber es scheiterte. Wenn ich das eine oder andere auskommentiert habe, funktioniert das unkommentierte. OK so ist, dann habe ich versucht, dies:

[HttpPost(Name = "UpdateCat")] 
public JsonResult Post([FromBody]Category mdl) 
{ ... snip... } 


[HttpPost(Name = "UpdateSubCat")] 
public JsonResult Post([FromBody]SubCategory mdl) 
{ ... snip... } 

Aber dies auch nicht einen Unterschied machen, nicht wahr? Also fing ich an zu googeln und bin auf dieses Problem gestoßen, aber es ist nicht das, wonach ich gesucht habe, da es sich um verschiedene HTTP-Aktionen handelt, die denselben Namen haben.

Is it possible to have duplicate action names and parameter list for post and get?

Was ich über den Umgang mit verschiedenen Post Aktionen bin Missverständnis?

+0

Gibt es einen besonderen Grund, dass Sie nicht einfach eine der Methoden umbenennen können? –

+0

No.Guess Ich sollte klarstellen, das ist ein akademisches Abenteuer für mich. Wenn ich umbenennen würde, wie würde es die API URL ändern? Angenommen, ich posten gerade auf localhost/api/test wäre es localhost/api/test/umbenanntepostmethod? – GPGVM

+0

Sind die Unterkategorien in irgendeiner Weise mit einer Kategorie verknüpft? – Nkosi

Antwort

2

Wenn Sie zwei POST-Methoden in demselben Web-API-Controller verwenden möchten, können Sie ein bestimmtes Routenmuster für die zweite POST-Methode mithilfe des Attributs Route definieren.

public class CategoryController: Controller 
{ 
    [HttpPost] 
    public HttpResponseMessage Post([FromBody]Category mdl) 
    { 
     return Request.CreateResponse(HttpStatusCode.OK, mdl); 
    } 
    [HttpPost] 
    [Route("~/api/products/SaveSubCat")] 
    public HttpResponseMessage Post([FromBody]SubCategory mdl) 
    { 
     return Request.CreateResponse(HttpStatusCode.OK, mdl); 
    } 
} 

Jetzt werden Ihre Anfragen unterschiedlich sein

api/products/ wird die erste Aktion Methode getroffen und api/producs/savesucat wird die zweite getroffen.

Ich schlage vor, Sie verschieben Ihre zweite Aktion auf einen SubCategory-Controller und verwenden Sie die Standard-POST-Methode.

+0

Ihre Theorie ist gesund. Beachten Sie, dass basierend auf den "HttpPost (string)" - Attributen des OPs das OP sich auf MVC6 bezieht und Ihre Antwort sich auf WebApi2 bezieht. *. – Nkosi

+0

Ja. Ich habe mvc6 Teil vermisst. Ich werde aktualisieren. – Shyju

+2

@Shyju ... Sie sind richtig und richtig. Ich kann die Route ändern und zwei Posts in einem Controller erreichen ... aber Sie sind genauer ... es sollte wirklich in einem separaten Controller sein. Danke. – GPGVM