簡體   English   中英

簡單發布到Web Api

[英]Simple post to Web Api

我正在嘗試獲取發布請求以使用網絡api。 以下是我的api控制器。

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

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

我已經更改了webapi路由,以考慮到該操作。 Temp模型看起來像這樣。

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

我的觀點看起來像這樣

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

除非我將[FromBody]屬性放在這樣的參數前面,否則以上代碼對postone完全不起作用。

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

然后執行操作,但ID仍為null。 它不會填充文本框中的值。

但是,如果我將Ajax.BeginFormUrl更改為posttwo ,則采用模型Temp ,它可以很好地工作,並且Id字段在文本框中獲取正確的值。

誰能解釋一下發生這種情況的原因,以及如何將簡單的值發布到網絡api操作中? 我的意思是,為什么它可以綁定復雜類型而不綁定簡單類型。

自從我問這個問題已經有一段時間了。 現在,我更加清楚地了解了這一點,我將提出一個更完整的答案來幫助他人。

在Web API中,記住參數綁定是如何發生的非常簡單。

  • 如果POST簡單類型,網頁API嘗試從URL將它綁定
  • 如果您發布POST復雜類型,則Web API會嘗試從請求的正文中綁定它(這使用media-type格式化程序)。

  • 如果要從URL綁定復雜類型,請在action參數中使用[FromUri] 這樣做的限制取決於您的數據將要存儲多長時間以及它是否超過了url字符限制。

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

  • 如果要綁定請求正文中的簡單類型,請在操作參數中使用[FromBody]。

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

作為旁注,假設您正在發出PUT請求(只是一個字符串)以更新某些內容。 如果您決定不將其附加到URL並作為僅在模型中具有一個屬性的復雜類型進行傳遞,則jQuery ajax中的data參數將如下所示。 您傳遞給data參數的對象只有一個屬性為空的屬性名。

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

您的網絡api操作將如下所示。

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

這個asp.net頁面解釋了所有這一切。 http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM