【问题标题】:Simple post to Web Api简单的发布到 Web Api
【发布时间】:2013-10-06 06:43:03
【问题描述】:

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

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

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

然后它触发了动作,但 id 仍然为空。它不会填充文本框中的值。

但是,如果我将 Ajax.BeginForm 的 Url 更改为 posttwo 以采用 Temp 模型,它可以很好地工作并且 Id 字段在文本框中得到正确的值。

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

【问题讨论】:

  • 是的,我知道。它只是浪费了我半天的工作时间,只是为了找出没有给 jQuery ajax 中的参数命名的小线索。
  • 嗯...所有的cmets在哪里?
  • 这有点奇怪……可能需要报告一下,看看出了什么问题。有没有可能是用户被删除了,间接删除了cmets?

标签: c# asp.net-mvc-4 asp.net-web-api http-post


【解决方案1】:

自从我问这个问题以来已经有一段时间了。现在我理解的更清楚了,我会放一个更完整的答案来帮助别人。

在 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}});

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

【讨论】:

  • 警告:不起作用! 'public HttpResponseMessage Post([FromBody] int id, [FromBody] string name) { ... }' 此规则的原因是请求正文可能存储在只能读取一次的非缓冲流中。
猜你喜欢
  • 2017-04-30
  • 1970-01-01
  • 2016-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-20
相关资源
最近更新 更多