Javascript JQuery ajax()数据中带有特殊字符的post抛出错误

Javascript JQuery ajax()数据中带有特殊字符的post抛出错误,javascript,asp.net,json,encoding,stringify,Javascript,Asp.net,Json,Encoding,Stringify,我希望有人能帮我弄清楚我一直在写的.net核心web api应用程序到底发生了什么-我花了一整天的时间试图调试它,这让我发疯 服务器应用程序是使用VS 2017 RC下的asp.net core 1.1以c#编写的。我有一个控制器,用于接受将返回简单对象的post。作为参考,基本控制器类如下所示: [HttpPost] public IActionResult Create([FromBody] websiteOrder myOrder) { return

我希望有人能帮我弄清楚我一直在写的.net核心web api应用程序到底发生了什么-我花了一整天的时间试图调试它,这让我发疯

服务器应用程序是使用VS 2017 RC下的asp.net core 1.1以c#编写的。我有一个控制器,用于接受将返回简单对象的post。作为参考,基本控制器类如下所示:

    [HttpPost]
    public IActionResult Create([FromBody] websiteOrder myOrder)
    {
        return StatusCode(201, new ObjectResult( OrderRepos.Add(myOrder)));
    }
我在客户端使用JQuery ajax()调用,如下所示:

$.ajax({
        url: myURL+"prices",
        type: 'POST',
        dataType: 'json',
        contentType: 'application/json; charset=utf-8',
        data:JSON.stringify(myCart),
        async: true,
        success: function (data) {
        ...
        },
        error: function (textStatus, errorThrown) {
        ...
        }
这项工作大部分时间都很好。但是,我注意到某些命令导致ajax()调用出错,响应错误。在最终追踪到这一点时,可以归结为MyCart数据中是否存在“英镑”(UK Pound)符号。如果存在英镑,则它将出错。如果我把英镑换成美元,那就行了

数据的好版本和坏版本的“字符串化”JSON如下所示:

$.ajax({
        url: myURL+"prices",
        type: 'POST',
        dataType: 'json',
        contentType: 'application/json; charset=utf-8',
        data:JSON.stringify(myCart),
        async: true,
        success: function (data) {
        ...
        },
        error: function (textStatus, errorThrown) {
        ...
        }
这项工作:

[{“sku\”:“WA01GMT\”、“num\”:1、“价格\”:“$180.00\”、“desc\”:“手表01-青铜色表带”、“cCode\”:“GB\”)”

这不起作用:

[{“sku\”:“WA01GMT\”,“num\”:1,“价格:”:“$180.00\”,“desc\”:“手表01-青铜表带”,“cCode\”:“GB\”]

我能看到的唯一区别是人物。我的印象是,默认情况下,所有ajax()调用都是utf-8。我是否在编码或语言环境方面遗漏了一些明显的东西?我(简要地)考虑过encodeURIComponent()等,但这是POST而不是GET,我的理解是默认情况下应该正确编码

顺便说一句,当错误发生时,服务器端不会触发任何东西,因为我在控制器上有一个断点。服务器和客户端都使用IIS在同一台本地计算机上运行

我们将非常感激您的任何想法/指导

重要编辑:

我已经做了一些进一步的测试。我假设问题出在ajax()调用和编码上,而不是服务器端。然而,我可能用这句话误导了你——道歉

在服务器端,有一个数据库记录,通过DbContext进行查找。这个数据库最初提供的数据在进程的早期进入myCart对象,然后在这个特定的ajax()POST返回到服务器时再次被访问。但是,此带符号的字段不是控制器中的索引或{id}字段-纯粹是POST中包含的辅助数据

奇怪的是,如果数据库中有字符,那么调用就会出错,即使我在提交ajax帖子之前在客户端手动编辑它:

myCart[0].price = "$180";
总之,我现在有一种情况,当POST发生时,JSON字符串在两种情况下(存在$sign)是相同的,但在一种情况下它会出错,而在另一种情况下它不会。不同之处在于,控制器在服务器上访问的服务器SQL数据库记录中存在一个符号。正如我前面提到的,控制器或接口中的代码似乎没有一个是在错误发生之前的某个地方执行的(有什么建议吗?)

[产生(“应用程序/json”)]
[路线(“api/价格”)]
公共类价格控制器:控制器
{
公共IPrice PriceRepo{get;set;}
公共价格控制人(IPrice\u repo)
{
价格回购=_回购;
}
[HttpPost]
公共IActionResult创建([FromBody]IEnumerable myCart)
{
返回状态码(201,新对象结果(PriceRepo.GetTotals(myCart));
}
[HttpGet(“{id}”,Name=“GetPrice”)]
公共IActionResult GetById(字符串id、字符串代码)
{
var item=PriceRepo.Find(id,cCode);
如果(项==null)
{
返回NotFound();
}
返回新的ObjectResult(项目);
}
}
很抱歉在这件事上打扰你-我将把我的调查转移到服务器数据库,并围绕它进行编码,看看我是否能找到问题,所以请不要担心ajax调用中出现的问题-情况似乎并非如此

我不熟悉.NETCore,也不熟悉MVC,所以数据库中的编码可能是一些比较基本的东西导致了这个问题。任何其他想法都可以为我指出正确的方向:-)

最终编辑-然后我放弃:-(

这似乎是我的计算机上的本地MSSQLSLocal Express数据库的问题。当我将此发布到Azure并使用Azure SQL数据库时,问题就会消失-只有在本地运行时才会发生

我曾尝试将相关列的排序规则更改为拉丁字母100的排序规则,但这似乎没有任何区别(不管怎么说,这有点冒险)

如果有人能向我解释为什么在调用控制器以获取特定记录时,web api控制器后面的本地数据库中的某个字段出现400错误,我很想知道:-(并且很乐意推荐答案:-).目前,我将做我最擅长的事情,并解决它,因为它在生产环境中似乎工作正常:-)


感谢您的评论

服务器端的页面(通过ajax请求的页面)也应该为utf-8指定。如果它是在php上,则具有如下标题:
header('Content-type:text/html;charset=utf-8')(只是一个例子)。我记得在使用web2py时遇到了类似的问题,问题在于编码。尝试将添加到myURL引用的文件中。作为旁注,价格不应是数据库中的字符串。它们应该是小数。然后,您应该为货币类型使用枚举,在前端,您可以在价格前面显示适当的字符,如美元符号Scott,这通常是一个公平的评论。然而,在这种特殊情况下,这是