jquery – json解析错误语法错误意外的输入结束

前端之家收集整理的这篇文章主要介绍了jquery – json解析错误语法错误意外的输入结束前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我得到以下代码
function pushJsonData(productName) {
    $.ajax({
        url: "/knockout/SaveProduct",type: "POST",contentType: "application/json",dataType: "json",data: " { \"Name\" : \"AA\" } ",async: false,success: function () {
            loadJsonData();   
        },error: function (jqXHR,textStatus,errorThrown) {
          alert(textStatus + " in pushJsonData: " + errorThrown + " " + jqXHR);
        }
    });
}

请注意,我硬编码了数据值。数据被推入数据库中。但是,我不断收到错误“解析错误语法错误意外的输入结束”。我确信我的数据是正确的JSON语法。当我使用Chrome浏览器的网络检查时,saveProduct请求显示数据是正确的。

{ "Name": "AA" }

此POST请求没有响应。所以我对解析错误来自哪里是无知的。我试过使用FireFox浏览器。同样的事情发生了。

有谁可以给​​出一些想法是什么错了?

谢谢,

美国
这是控制器代码

namespace MvcApplJSON.Controllers
{
    public class KnockoutController : Controller
    {
        //
        // GET: /Knockout/

        public ActionResult Index()
        {
            return View();
        }

        [HttpGet]
        public JsonResult GetProductList()
        {
            var model = new List<Product>();
            try
            {
                using (var db = new KOEntities())
                {
                    var product = from p in db.Products orderby p.Name select p;
                    model = product.ToList();
                }
            }
            catch (Exception ex)
            { throw ex; }
            return Json(model,JsonRequestBehavior.AllowGet);
        }
        [HttpPost]
        public void SaveProduct (Product product)
        {
            using (var db = new KOEntities())
            {
                db.Products.Add(new Product { Name = product.Name,DateCreated = DateTime.Now });
                db.SaveChanges();
            }
        }
    }
}

解决方法

不能确定问题是什么。可能是一些坏的角色,可能是你在开始和结束时留下的空间,不知道。

无论如何,你绝对不要像你那样将JSON作为字符串进行硬编码。相反,将JSON数据发送到服务器的正确方法是使用JSON序列化程序:

data: JSON.stringify({ name : "AA" }),

现在在服务器上也确保你有正确的视图模型期望接收这个输入:

public class Userviewmodel
{
    public string Name { get; set; }
}

和相应的动作:

[HttpPost]
public ActionResult SaveProduct(Userviewmodel model)
{
    ...
}

现在还有一件事情你指定了dataType:’json’。这意味着您希望服务器将返回JSON结果。控制器操作必须返回JSON。如果您的控制器操作返回一个视图,这可能会解释您正在获得的错误。当jQuery尝试解析服务器的响应时:

[HttpPost]
public ActionResult SaveProduct(Userviewmodel model)
{
    ...
    return Json(new { Foo = "bar" });
}

据说,在大多数情况下,当对ASP.NET MVC控制器动作进行AJAX请求时,您不需要设置dataType属性。原因是因为当您返回一些特定的ActionResult(例如ViewResult或JsonResult)时,框架将自动设置正确的Content-Type响应HTTP头。然后,jQuery将使用此标头来解析响应,并将其作为参数提供给已解析的成功回调。

我怀疑你在这里遇到的问题是你的服务器没有返回有效的JSON。它返回了一些ViewResult或PartialViewResult,或者您尝试在控制器操作中手动制作一些破坏的JSON(显然,您不应该这样做,而是使用JsonResult)。

哦,另外还有一件事,我只是注意到让我的眼睛流血了:

async: false,

认真的请永远不要将此属性设置为false。我看到人们一遍又一遍地这样做。这是荒谬的如果你把这个属性设置为false,那么你不再做AJAX了。您在整个执行请求期间阻止/冻结客户端浏览器,从而杀死了AJAX给您的所有好处。在这种情况下只需要正常的请求。不要打扰JavaScript。如果你想做AJAX,那么就停止在程序和顺序编程方面的思考。开始思考异步事件和回调。

猜你在找的jQuery相关文章