我得到了以下代码
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 of Chrome检查器上查看时,saveProduct请求显示数据是正确的.
{ "Name": "AA" }
此POST请求没有响应.所以我对解析错误的来源毫无头绪.我尝试过使用FireFox浏览器.同样的事情发生了.
任何人都可以对错误提出一些看法吗?
谢谢,
PS这是控制器代码
namespace MvcApplJSON.Controllers { public class KnockoutController : Controller { // // GET: /Knockout/ public ActionResult Index() { return View(); } [HttpGet] public JsonResult GetProductList() { var model = new List(); 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(); } } } }
Darin Dimitr.. 73
不能确定问题是什么.可能是一些不好的角色,可能是你在开始和结束时留下的空间,不知道.
无论如何,你不应该像你那样将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" }); }
这就是说,在大多数情况下,在dataType
向ASP.NET MVC控制器操作发出AJAX请求时,您不需要设置属性.原因是当您返回一些特定的ActionResult(例如ViewResult或JsonResult)时,框架将自动设置正确的ActionResult
响应HTTP标头.然后,jQuery将使用此标头来解析响应并将其作为参数提供给已解析的成功回调.
我怀疑你在这里遇到的问题是你的服务器没有返回有效的JSON.它要么返回一些ViewResult,要么返回PartialViewResult,或者你试图在你的控制器动作中手动制作一些破碎的JSON(显然你不应该这样做,而是使用JsonResult).
我刚注意到的另一件事:
async: false,
请避免将此属性设置为false.如果您将此属性设置为ViewResult
您在整个请求执行期间冻结客户端浏览器.在这种情况下,您可以发出正常请求.如果您想使用AJAX,请开始考虑异步事件和回调.
不能确定问题是什么.可能是一些不好的角色,可能是你在开始和结束时留下的空间,不知道.
无论如何,你不应该像你那样将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" }); }
这就是说,在大多数情况下,在dataType
向ASP.NET MVC控制器操作发出AJAX请求时,您不需要设置属性.原因是当您返回一些特定的ActionResult(例如ViewResult或JsonResult)时,框架将自动设置正确的ActionResult
响应HTTP标头.然后,jQuery将使用此标头来解析响应并将其作为参数提供给已解析的成功回调.
我怀疑你在这里遇到的问题是你的服务器没有返回有效的JSON.它要么返回一些ViewResult,要么返回PartialViewResult,或者你试图在你的控制器动作中手动制作一些破碎的JSON(显然你不应该这样做,而是使用JsonResult).
我刚注意到的另一件事:
async: false,
请避免将此属性设置为false.如果您将此属性设置为ViewResult
您在整个请求执行期间冻结客户端浏览器.在这种情况下,您可以发出正常请求.如果您想使用AJAX,请开始考虑异步事件和回调.