当前位置:首页 > 后端 > .net > 正文内容

WebAPI 为什么你的[FromBody]参数总是为NULL

放牧的风3年前 (2018-04-10).net65

出于某种原因,我总是忘记Web API参数绑定的工作原理。无数次,我的[FromBody]参数为NULL。

有时间整理一下并写下来,防止以后再犯同样的错误。

大家可以阅读关于Web API中参数绑定的官方文档 parameter-binding-in-aspnet-web-api

言归正传,这是我最初的请求,测试时不起作用:

$.ajax({
    type: "POST",
    contentType: "application/json; charset=utf-8",
    url: "api/discount/saveEmailForDiscount",
    data: {email: "some@email.com"}
});

C#代码如下:

[HttpPost, Route("api/discount/saveEmail")]
public IHttpActionResult SaveEmailForDiscount([FromBody] string email)  
{    
    //do something with e-mail
    return Ok(email);
}

要强制Web API从请求主体读取“简单”类型,您需要将[FromBody]属性添加到参数中。

 

Web API reads the response body at most once, so only one parameter of an action can come from the request body. If you need to get multiple values from the request body, define a complex type.

Web API最多只读取一次响应主体,因此只有一个操作参数可以来自请求主体。如果您需要从请求主体获取多个值,请定义一个复杂类型。


但email的值仍然是NULL。

JavaScript代码是我们使用的通用方法的一部分,所以这就是内容类型设置为application/json; charset=utf-8。虽然上面提到的文章中的例子也使用了内容类型application/json,但这是我们问题的根源。

AJAX请求的默认内容类型是application/x-www-form-urlencoded; charset=UTF-8。所以,如果我们不设定内容类型,或指定它为pplication/x-www-form-urlencoded; charset=UTF-8,它应该是正确的?

呃...不,显然这个值应该像这样格式化:

=value

知道这会产生最终的JavaScript代码:

$.ajax({
   type: "POST",
    contentType: "application/x-www-form-urlencoded; charset=UTF-8", //this could be left out as it is the default content-type of an AJAX request
    url: "api/discount/saveEmailForDiscount",
    data: =+"some@email.com"
});

最后要提到的是Asp.Net网站上的评论:

Before sending a simple type, consider wrapping the value in a complex type instead. This gives you the benefits of model validation on the server side, and makes it easier to extend your model if needed.

在发送简单类型之前,请考虑将值包装在复杂类型中。这为您提供了服务器端模型验证的好处,并且可以在需要时扩展模型

 


扫描二维码推送至手机访问。

版权声明:本文由放牧的风发布,如需转载请注明出处。

本文链接:https://faka.grazingwind.com/post/14.html

分享给朋友:

相关文章

C#中string类型是值类型还是引用类型?

.Net框架程序设计(修订版)中有这样一段描述:String类型直接继承自Object,这使得它成为一个引用类型,也就是说线程上的堆栈上不会驻留有任何字符串。string类型(引用类型) 名称CTS类型说明stringSystem...

5天玩转C#并行和多线程编程系列

5天玩转C#并行和多线程编程系列文章目录5天玩转C#并行和多线程编程 —— 第一天 认识Parallel5天玩转C#并行和多线程编程 —— 第二天 并行集合和PLinq5天玩转C#并行和多线程编程 —— 第三天 认识和使用Task5天玩转C...

WCF、WebAPI、WCFREST、WebService之间的区别和选择

在.net平台下,有大量的技术让你创建一个HTTP服务,像Web Service,WCF,现在又出了Web API。在.net平台下,你有很多的选择来构建一个HTTP Services。我分享一下我对Web Service、WCF以及Web...

.NET常用第三方库(包)总结

序列化与反序列化JSON.NET应该是.NET平台上使用最为广泛的序列化/反序列化包了,ASP.NET和ASP.NET Core中默认序列化/反序列化包Jil官网上说性能优于JSON.NET文本日志记录NLogLog4Net以上二位都是从J...

C#图解教程

初识本书是在知乎,许多网友推荐它作为 C# 入门书籍。 本书的最大特点是插图丰富,许多复杂的概念,一副插图就解释得通透明了。 本书另外一个隐藏特性是作者有着 C/C++ 经验,书中经常提到它们...

C# 高效字符串连接 StringBuilder介绍

在介绍StringBuilder之前,必须要先了解string的特性。string在.NET中属于基本数据类型,也是基本数据类型中唯一的引用类型。字符串可以声明为常量,但它却放在了堆中。一:不可改变对象在.NET中String是不可改变对象...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。