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,那么就停止在程序和顺序编程方面的思考。开始思考异步事件和回调。