【发布时间】:2020-06-26 12:53:38
【问题描述】:
我知道这个问题已经被问过好几次了,但是以前的解决方案都没有帮助我解决我的问题(实际上这似乎很简单)。 我只想将 Json 对象发送到我在控制器类中创建的 Post 方法。 这是我的控制器类中有趣的部分:
[Route("api/[controller]")]
public class CodeController : Controller
{
[HttpPost]
public void Post([FromBody] InfoNegozio value)
{
return;
}
}
我保持简单,因为我只想正确设置值。 这是 InfoNegozio 类:
public class InfoNegozio
{
public int IdNegozio { get; set; }
public string NomeNegozio { get; set; }
public int AttesaStimata { get; set; }
public DateTime UltimoAggiornamento { get; set; }
}
这是用于向此 API 发送数据的代码:
var myData = { "IdNegozio": idNegozio, "AttesaStimata": tempoAttesa };
$.ajax({
url: "api/Code",
type: "POST",
contentType: "application/json",
dataType: "json",
data: JSON.stringify(myData)
});
jQuery代码只是调用了webapi控制器,value字段是一个非空的InfoNegozio对象,但是IdNegozio和AttesaStimata字段总是0。
我可以要求我在 Razor 页面项目中使用控制器,并且我必须在 Startup.Configure 方法中添加这行代码才能使其工作(“它”是指另一个 webapi GET 方法)。
app.UseEndpoints(endpoints => { endpoints.MapControllers(); });
有什么想法吗?
已编辑
通过使用邮递员,我发现了正常通话和不正常通话之间的区别。 用邮递员发布这个 json 是有效的:
{
"IdNegozio": 1,
"AttesaStimata": 36
}
不幸的是,使用 jquery,使用 JSON.stringify,我得到了这个(注意值上的双引号):
{
"IdNegozio": "1",
"AttesaStimata": "36"
}
这行不通! Json stringify 是否与 .net core Web Api 不兼容?是否有可能没有一种干净的方法可以使这两个库一起工作?
编辑 2
我最终手动构建了 json,强制 jquery 发送“我的版本”,所以我的 js 代码现在正在寻找:
var myData = '{ "IdNegozio": '+idNegozio+', "AttesaStimata": '+tempoAttesa+' }';
$.ajax({
url: "api/Code",
type: "POST",
contentType: "application/json",
dataType: "json",
data: myData
});
无论如何我不喜欢这个解决方案,因为我似乎没有使用正确的方法来构建 json 对象,所以任何更智能的解决方案都将不胜感激。
【问题讨论】:
-
只是为了确认这是一个服务器端问题,您是否尝试过使用 Postman 之类的工具发布 JSON?如果你有同样的问题,那么至少你肯定知道它是服务器端的,而不是你的 jQuery 做的奇怪的事情。如果您发布字符串和日期时间字段,它们是否也为空/空?
-
@BryanLewis:在用 Postman 测试后,我用一些细节编辑了帖子
-
好的,让我澄清一下问题是什么,以便我可以尝试提供帮助。您在客户端应用程序中的 jQuery 代码确实达到了正确的端点,对吗?如果是,那么我们可以假设这不是路由问题。听起来您的问题是控制器在绑定/反序列化 InfoNegozio 对象时为您的属性设置默认值。两个值都是 0 还是字符串值 null ? 0 是 int 的默认值,所以这是有道理的,但 0 的字符串值不会相加。
-
@jandrew:客户端正在访问正确的端点。通过邮递员,我发现问题在于 json 的序列化。查看 EDIT 标头之后的部分,我展示了两个略有不同的 json。一个是用邮递员手动创建的,它正在工作,另一个来自 jquery 调用,它不工作。在不工作的情况下,对象被初始化,但 2 个感兴趣的属性都设置为 0,尽管 json 有效负载中的值。请注意,这两个属性都是 int,不涉及字符串
-
重新阅读您的编辑,我想我知道出了什么问题。您使用的是什么 JSON 序列化框架?除非您使用的是 .NET Core 3,否则我会假设它是 Newtonsoft JSON,除非您手动更改它。问题可能出在 .NET Core 应用程序中的某些序列化设置中。可能为什么您是 Postman 请求,但整数值周围没有引号。
标签: json .net-core asp.net-core-webapi