简单的张贴到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.BeginFormUrl更改为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