Einfacher Beitrag zu Web Api

71

Ich versuche, eine Post-Anfrage für die Arbeit mit der Web-API zu erhalten. Es folgt mein API-Controller.

public class WebsController : ApiController
{
    [HttpPost]
    public void PostOne(string id)
    {
    }

    [HttpPost]
    public void PostTwo(Temp id)
    {
    }
}

Ich habe die Webapi-Route geändert, um die Aktion zu berücksichtigen. Das Temp-Modell sieht ungefähr so ​​aus.

public class Temp
{
    public string Id { get; set; }
}

Meine Ansicht sieht ungefähr so ​​aus

@using (Ajax.BeginForm(new AjaxOptions
{
    Url = "/api/webs/postone",
    HttpMethod = "post"
}))
{
    <input name="id" id="id" value="2" />
    <input type="submit" value="submit" />
}

Der obige Code funktioniert mit dem Postone überhaupt nicht, es sei denn, ich setze das Attribut [FromBody] wie folgt vor den Parameter.

[HttpPost]
public void PostOne([FromBody]string id)
{
}

dann trifft es die Aktion, aber die ID ist immer noch null. Es wird nicht mit dem Wert im Textfeld gefüllt.

Aber wenn ich das ändere Urldas Ajax.BeginFormzu posttwodem nimmt das Modell Temp, es funktioniert gut und das IdFeld wird den richtigen Wert in der Textbox.

Kann mir bitte jemand den Grund dafür erklären und wie ich einen einfachen Wert für eine Web-API-Aktion veröffentlichen kann? Ich meine, warum kann es einen komplexen Typ binden, aber keinen einfachen Typ.

Amila
quelle
ja ich weiß. Es hat nur die Hälfte meines Arbeitstages verschwendet, um herauszufinden, dass der Parameter in jQuery ajax keinen Namen hat.
Amila
Hmm ... wo sind all die Kommentare?
Denny
Das ist ein bisschen seltsam ... muss sich vielleicht melden und sehen, was schief gelaufen ist. Ist es möglich, dass die Benutzer die Kommentare gelöscht und indirekt gelöscht haben?
Amila

Antworten:

111

Es ist schon einige Zeit her, seit ich diese Frage gestellt habe. Jetzt verstehe ich es klarer, ich werde eine vollständigere Antwort geben, um anderen zu helfen.

In der Web-API ist es sehr einfach, sich daran zu erinnern, wie die Parameterbindung erfolgt.

  • Wenn Sie POSTeinfache Typen eingeben, versucht die Web-API, diese über die URL zu binden
  • Wenn Sie einen POSTkomplexen Typ verwenden, versucht die Web-API, ihn aus dem Hauptteil der Anforderung zu binden (dies verwendet einen media-typeFormatierer).

  • Wenn Sie einen komplexen Typ aus der URL binden möchten, verwenden Sie ihn [FromUri]in Ihrem Aktionsparameter. Die Einschränkung hängt davon ab, wie lange Ihre Daten dauern und ob sie das URL-Zeichenlimit überschreiten.

    public IHttpActionResult Put([FromUri] ViewModel data) { ... }

  • Wenn Sie einen einfachen Typ aus dem Anforderungshauptteil binden möchten, verwenden Sie [FromBody] in Ihrem Aktionsparameter.

    public IHttpActionResult Put([FromBody] string name) { ... }

Angenommen, Sie stellen eine PUTAnfrage (nur eine Zeichenfolge), um etwas zu aktualisieren. Wenn Sie sich entscheiden, es nicht an die URL anzuhängen und als komplexen Typ mit nur einer Eigenschaft im Modell zu übergeben, datasieht der Parameter in jQuery ajax wie folgt aus. Das Objekt, das Sie an den Datenparameter übergeben, hat nur eine Eigenschaft mit einem leeren Eigenschaftsnamen.

var myName = 'ABC';
$.ajax({url:.., data: {'': myName}});

und Ihre Web-API-Aktion sieht ungefähr so ​​aus wie unten.

public IHttpActionResult Put([FromBody] string name){ ... }

Diese asp.net Seite erklärt alles. http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api

Amila
quelle
1
Achtung: Funktioniert nicht! 'public HttpResponseMessage Post ([FromBody] int id, [FromBody] Zeichenfolgenname) {...}' Der Grund für diese Regel ist, dass der Anforderungshauptteil möglicherweise in einem nicht gepufferten Stream gespeichert ist, der nur einmal gelesen werden kann.
Gyosifov