我正在尝试获取使用网络 API 的发布请求。以下是我的 api Controller 。
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; }
}
我的 View 看起来像这样
@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)
{
}
然后它触发了 Action ,但是 id 仍然是 null。它不会填充文本框中的值。
但是,如果我将 Ajax.BeginForm
的 Url
更改为采用模型 Temp
的 posttwo
, 它工作得很好并且 Id
字段在文本框中获得了正确的值。
任何人都可以向我解释发生这种情况的原因以及我如何将一个简单的值发布到 Web API 操作吗?我的意思是,为什么它可以绑定(bind)一个复杂类型而不能绑定(bind)一个简单类型。
最佳答案
我问这个问题已经有一段时间了。现在我更清楚地理解它了,我将给出一个更完整的答案来帮助其他人。
在 Web API 中,记住参数绑定(bind)是如何发生的非常简单。
- 如果您
POST
简单类型,Web API 会尝试从 URL 绑定(bind)它 如果您
POST
复杂类型,Web API 会尝试从正文中绑定(bind)它 请求(这使用media-type
格式化程序)。如果您想从 URL 绑定(bind)复杂类型,您将在操作参数中使用
[FromUri]
。这样做的限制取决于您的数据的长度以及它是否超过 url 字符限制。public IHttpActionResult Put([FromUri] ViewModel 数据) { ... }
如果您想从请求主体绑定(bind)一个简单类型,您将在操作参数中使用 [FromBody]。
public IHttpActionResult Put([FromBody] string name) { ... }
作为旁注,假设您正在发出 PUT
请求(只是一个字符串)来更新某些内容。如果您决定不将它附加到 URL 并作为模型中只有一个属性的复杂类型传递,则 jQuery 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
关于c# - 简单发布到 Web Api,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19093603/