简单的张贴到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]属性放在参数之前。
[HttpPost] public void PostOne([FromBody]string id) { }
那么它会触发该动作,但该ID仍然为空。 它不会在文本框中填充值。
但是,如果我将Ajax.BeginForm
的Url
更改为posttwo
,它将采用Temp
模式,它很好地工作, Id
字段在文本框中获得正确的值。
任何人都可以请解释我发生这种情况的原因,以及如何我可以发布一个简单的值到一个web api行动? 我的意思是,为什么它可以绑定一个复杂的types,但不是简单的types。
自从我问这个问题已经有相当长的一段时间了。 现在我更清楚地理解了,我会提出一个更完整的答案来帮助别人。
在Web API中,记住参数绑定是如何发生的非常简单。
- 如果您
POST
简单的types,Web API尝试从URL绑定它 -
如果
POST
复杂types,Web API将尝试从请求的主体(它使用media-type
格式化程序)绑定它。 -
如果你想从URL中绑定一个复杂的types,你将在你的action参数中使用
[FromUri]
。 这个问题的局限性在于你的数据需要多长时间,如果超过了url字符数限制。public IHttpActionResult Put([FromUri] ViewModel data) { ... }
-
如果你想从请求体中绑定一个简单的types,你将在你的action参数中使用[FromBody]。
public IHttpActionResult Put([FromBody] string name) { ... }
作为一个侧面说明,说你正在做一个PUT
请求(只是一个string)来更新一些东西。 如果您决定不将它追加到URL中,并以模型中只有一个属性的复杂types传递,那么jQuery ajax中的data
参数将如下所示。 传递给数据参数的对象只有一个属性名称为空的属性。
var myName = 'ABC'; $.ajax({url:.., data: {'': myName}});
和你的web 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