简单的发布到 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.BeginFormUrl 更改为 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

将音频(字节数组)发布到 MVC.NET Web Api

将 ASP.NET Core 5 Web API 发布到 Azure 应用服务

发出简单的 Web API 发布请求

CKEditor 和 C# Web API,使用简单的上传插件上传图片

asmx 到 WCF 或 Web API