简单的发布到 Web Api
Posted
技术标签:
【中文标题】简单的发布到 Web Api【英文标题】:Simple post to 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? 【参考方案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) ... ' 此规则的原因是请求正文可能存储在只能读取一次的非缓冲流中。以上是关于简单的发布到 Web Api的主要内容,如果未能解决你的问题,请参考以下文章
IIS 上的 Angular 发布到 Asp.Net(非核心)Web Api 错误 415
将 ASP.NET Core 5 Web API 发布到 Azure 应用服务