JQuery ajax()在数据

时间:2017-02-19 02:07:23

标签: javascript asp.net json encoding stringify

我希望有人可以帮我弄清楚我写过的.net核心web-api应用程序是怎么回事 - 我花了一整天的时间尝试调试它,这让我发疯了。

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

    [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()调用错误并导致400 Bad Response。在最终追踪它时,它归结为MyCart数据中是否存在'£'(英镑)符号。如果£存在则会出错。如果我将£换成$符号,那么它可以正常工作。

数据的好坏版本的'stringified'JSON如下:

这有效:

  

[{\“sku \”:\“WA01GMT \”,\“num \”:1,\“price \”:\“$ 180.00 \”,\“desc \”:\“观看01 - Gunmetal with tan strap \“,\”cCode \“:\”GB \“}]”

这不起作用:

  

[{\“sku \”:\“WA01GMT \”,\“num \”:1,\“price \”:\“£180.00 \”,\“desc \”:\“观看01 - 青铜色用棕褐色表带\“,\”cCode \“:\”GB \“}]”

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

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

非常感谢任何想法/指导。

重要编辑:

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

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

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

myCart[0].price = "$180";

基本上,总的来说,我现在遇到这样一种情况:当POST发生时,JSON字符串在两种情况下(存在$符号)是相同的,但在一种情况下它是错误而另一种情况则不是。不同之处在于,控制器在服务器上访问的服务器SQL数据库记录中存在£符号。正如我前面提到的那样 - 控制器或界面中的代码似乎都没有出现错误发生在某个地方(这可能是什么建议?)

[Produces("application/json")]
[Route("api/Prices")]
public class PricesController : Controller
{
    public IPrice PriceRepo { get; set; }

    public PricesController(IPrice _repo)
    {
        PriceRepo = _repo;
    }


    [HttpPost]
    public IActionResult Create([FromBody] IEnumerable<ProductOrder> myCart) 
    {
        return StatusCode(201, new ObjectResult(PriceRepo.GetTotals(myCart)));
    }


    [HttpGet("{id}", Name = "GetPrice")]
    public IActionResult GetById(string id, string cCode)
    {
        var item = PriceRepo.Find(id,cCode);
        if (item == null)
        {
            return NotFound();
        }
        return new ObjectResult(item);
    }
}

很抱歉让你搞砸了 - 我会将我的调查转移到服务器数据库并对其进行编码,看看我是否能找到问题所以请不要担心ajax调用中没有工作的东西 - 这不会似乎是这样。

我是.net核心的新手,对于MVC来说还是新手,所以在数据库中编码可能导致问题的相当基础。欢迎任何其他想法指出我正确的方向: - )

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

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

我已经尝试将相关列的排序规则更改为Latin_100排序规则,但这似乎没有任何区别(无论如何在黑暗中刺伤一点)。

如果有人能向我解释为什么在我的本地数据库中的一个字段中坐在web-api控制器上的£符号在调用该特定记录的控制器时导致400错误我很想知道:-(并乐意推荐答案:-)。暂时我会做我最擅长的事情并解决它,因为它似乎在生产环境中正常工作: - )

感谢您的评论

0 个答案:

没有答案