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 Url
das Ajax.BeginForm
zu posttwo
dem nimmt das Modell Temp
, es funktioniert gut und das Id
Feld 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.
Antworten:
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.
POST
einfache Typen eingeben, versucht die Web-API, diese über die URL zu bindenWenn Sie einen
POST
komplexen Typ verwenden, versucht die Web-API, ihn aus dem Hauptteil der Anforderung zu binden (dies verwendet einenmedia-type
Formatierer).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
PUT
Anfrage (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,data
sieht 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
quelle