我得到以下代码
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);
}
});
}
请注意,我对数据值进行了硬编码。数据被很好地插入数据库。但是,我不断收到错误
parsing error syntax error unexpected end of input
我确信我的数据是正确的 JSON 语法。当我在 Chrome 网络检查器上检查时,saveProduct 请求显示数据是正确的。
{ "Name": "AA" }
此 POST 请求没有响应。所以我对解析错误的来源一无所知。我尝试使用 FireFox 浏览器。同样的事情发生了。
谁能给出一些关于哪里出了问题的想法?
谢谢,
附: 这是 Controller 代码
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" }),
现在在服务器上还要确保你有正确的 View 模型来接收这个输入:
public class UserViewModel
{
public string Name { get; set; }
}
以及对应的 Action :
[HttpPost]
public ActionResult SaveProduct(UserViewModel model)
{
...
}
现在还有一件事。您已指定 dataType: 'json'
。这意味着您期望服务器将返回 JSON 结果。 Controller 操作必须返回 JSON。如果您的 Controller 操作返回一个 View ,这可以解释您遇到的错误。当 jQuery 尝试解析来自服务器的响应时:
[HttpPost]
public ActionResult SaveProduct(UserViewModel model)
{
...
return Json(new { Foo = "bar" });
}
话虽如此,在大多数情况下,当向 ASP.NET MVC Controller 操作发出 AJAX 请求时,通常不需要设置 dataType
属性。这样做的原因是因为当你返回一些特定的ActionResult
(比如一个ViewResult
或者一个JsonResult
)时,框架会自动设置正确的Content-Type
响应 HTTP header 。然后,jQuery 将使用此 header 解析响应并将其作为参数提供给已解析的成功回调。
我怀疑您在这里遇到的问题是您的服务器没有返回有效的 JSON。它要么返回一些 ViewResult 或 PartialViewResult,要么您尝试在 Controller 操作中手动制作一些损坏的 JSON(显然您不应该这样做,而是使用 JsonResult 代替)。
我刚刚注意到的另一件事:
async: false,
请避免将此属性设置为 false。如果您将此属性设置为 false
,您将在整个请求执行期间卡住客户端浏览器。在这种情况下,您可以提出一个正常的请求。如果您想使用 AJAX,请从异步事件和回调的角度开始考虑。
https://stackoverflow.com/questions/20827372/