简单发布到 Web API

本文关键字:Web API 简单 | 更新日期: 2023-09-27 18:33:15

我正在尝试获取一个使用 Web 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" />
}

上面的代码根本不适用于postone,除非我像这样将[FromBody]属性放在参数前面。

[HttpPost]
public void PostOne([FromBody]string id)
{
}

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

但是,如果我将Ajax.BeginFormUrl更改为采用模型Tempposttwo,它工作得很好,并且Id字段在文本框中获得正确的值。

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

简单发布到 Web API

自从我问这个问题以来已经有一段时间了。现在我明白了,我要给出一个更完整的答案来帮助别人。

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

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

  • 如果要从 URL 绑定复杂类型,请在操作参数中使用[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}});

您的 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