简单发布到Web Api


71

我正在尝试获取发布请求以使用网络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。它不会填充文本框中的值。

但是,如果我改变Url了的Ajax.BeginFormposttwo内搭模型Temp,它很好地工作和Id领域在文本框中得到应有的价值。

谁能解释一下发生这种情况的原因,以及如何将简单的值发布到网络api操作中?我的意思是,为什么它可以绑定复杂类型而不绑定简单类型。


是的,我知道。只是浪费了我半天的工作时间,只是为了找出在jQuery ajax中不给参数命名的小线索。
阿米拉

嗯...所有评论都在哪里?
丹尼

有点奇怪...可能必须报告并查看出了什么问题。用户是否有可能被删除并间接删除了评论?
阿米拉

Answers:


111

自从我问这个问题已经有一段时间了。现在,我更加清楚地了解了这一点,我将提出一个更完整的答案来帮助他人。

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

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

  • 如果要从URL绑定复杂类型,将[FromUri]在action参数中使用。这种限制取决于您的数据将要存储多长时间以及它是否超过了url字符限制。

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

  • 如果要绑定请求正文中的简单类型,请在操作参数中使用[FromBody]。

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

作为旁注,假设您正在PUT请求(只是一个字符串)更新某些内容。如果您决定不将其附加到URL并作为仅在模型中具有一个属性的复杂类型进行传递,则datajQuery ajax中的参数将如下所示。您传递给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


1
注意:将不起作用!'public HttpResponseMessage Post([FromBody] int id,[FromBody]字符串名称){...}'该规则的原因是请求正文可能存储在只能读取一次的非缓冲流中。
gyosifov
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.