[英]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.BeginForm
的Url
更改為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.