简单发布到Web Api

Ami*_*ila 69 c# http-post asp.net-mvc-4 asp.net-web-api

我正在尝试使用web api发布帖子请求.以下是我的api控制器.

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

    [HttpPost]
    public void PostTwo(Temp id)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

我已经改变了webapi路线以考虑行动.Temp模型看起来像这样.

public class Temp
{
    public string Id { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我的观点看起来像这样

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

除非我将[FromBody]属性放在参数前面,否则上面的代码根本不适用于postone.

[HttpPost]
public void PostOne([FromBody]string id)
{
}
Run Code Online (Sandbox Code Playgroud)

然后它命中动作,但id仍为null.它不会填充文本框中的值.

但是,如果我改变UrlAjax.BeginFormposttwo采取何种模式Temp,它很好地工作和Id领域在文本框中得到应有的价值.

任何人都可以请解释一下这种情况发生的原因以及如何将简单的值发布到网络API动作中?我的意思是,为什么它可以绑定复杂类型而不是简单类型.

Ami*_*ila 109

自从我问这个问题以来,已经有一段时间了.现在我更清楚地理解它,我将提供一个更完整的答案来帮助别人.

在Web API中,记住参数绑定是如何发生的非常简单.

  • 如果是POST简单类型,Web API会尝试从URL绑定它
  • 如果您是POST复杂类型,Web API会尝试将其与请求正文绑定(这使用media-type格式化程序).

  • 如果要从URL绑定复杂类型,则将[FromUri]在action参数中使用.这种情况的局限性取决于您的数据将会持续多长时间以及它是否超过网址字符限制.

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

  • 如果要从请求主体绑定简单类型,则可以在action参数中使用[FromBody].

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

作为旁注,假设您正在发出PUT请求(只是一个字符串)来更新某些内容.如果您决定不将其附加到URL并作为复杂类型传递,模型中只有一个属性,那么datajQuery ajax中的参数将如下所示.传递给data参数的对象只有一个属性为空属性的属性.

var myName = 'ABC';
$.ajax({url:.., data: {'': myName}});
Run Code Online (Sandbox Code Playgroud)

并且您的web api操作将如下所示.

public IHttpActionResult Put([FromBody] string name){ ... }
Run Code Online (Sandbox Code Playgroud)

这个asp.net页面解释了这一切. http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api