Javascript Ajax调用失败,出现错误“0”;SyntaxError:JSON.parse错误:位置0处出现意外输入;
我在使用Ajax Post方法从视图成功调用控制器时遇到问题 以下是ajax调用:Javascript Ajax调用失败,出现错误“0”;SyntaxError:JSON.parse错误:位置0处出现意外输入;,javascript,jquery,ajax,Javascript,Jquery,Ajax,我在使用Ajax Post方法从视图成功调用控制器时遇到问题 以下是ajax调用: var Model = { Ration: "123", Batch: "2323", IngredientAmountList: "34", InputAmount: "35", RationTotalWe
var Model =
{
Ration: "123",
Batch: "2323",
IngredientAmountList: "34",
InputAmount: "35",
RationTotalWeight:"55"
};
$.ajax({
url: '@Url.Action("AjaxCall", "Producer")',
type: "POST",
data: JSON.stringify(Model),
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (data) {
console.log("success");
console.log(data);
console.log(data.length);
},
failure: function (data) {
console.log("failure");
},
error: function (jqxhr, textStatus, errorThrown) {
console.log(jqxhr);
console.log(textStatus);
console.log(errorThrown);
},
});
以下是接收Ajax调用的控制器方法:
[HttpPost]
public JsonResult AjaxCall()
{
//var modelTest = Model;
return new JsonResult();
}
web浏览器将从ajax方法错误函数中打印出错误。我感兴趣的是,如果在控制器中的AjaxCall()上设置了断点,它将命中断点。如果给AjaxCall()一个字符串参数AjaxCall(字符串测试){},它仍然会命中断点并失败。如果AjaxCall()是我最后想要做的模型参数,即AjaxCall(MyModel model){},它甚至不会到达控制器中的断点
为ajax调用传入的模型拥有实际模型的所有公共getter/setter属性
ajax API打印出来的错误是“SyntaxError:JSON.parse error:Unexpected input at position:0”,这也是我在网上找不到的
感谢您提供的任何建议我猜您没有从控制器传递有效数据。 尝试将空js对象作为JSON结果传递
返回“{}”
。
请参阅下面的代码
[HttpPost]
public JsonResult AjaxCall()
{
//var modelTest = Model;
return '{}';
}
如果此操作未返回错误,则您作为结果传递的数据不是有效的JSON数据。尝试如下操作:
var Model =
{
Ration: "123",
Batch: "2323",
IngredientAmountList: "34",
InputAmount: "35",
RationTotalWeight:"55"
};
$.ajax({
url: '@Url.Action("AjaxCall", "Producer")',
type: "POST",
dataType: "json",
data: { myAjaxModel: Model }, //Make sure data holds name of parameter passed to controller method
//I removed the contentType and use ajax's default object type, pass the model as a Model object to controller
success: function (data) {
const jsonResult = JSON.parse(data); //parse the response
console.log("success");
console.log(data);
console.log(data.length);
},
failure: function (data) {
console.log("failure");
},
error: function (jqxhr, textStatus, errorThrown) {
console.log(jqxhr);
console.log(textStatus);
console.log(errorThrown);
},
});
//Changed this to return a string, which is the json version of model
[HttpPost]
public string AjaxCall(Model myAjaxModel)
{
var modelTest = myAjaxModel;
//Create a javascript serializer to serialize your model
System.Web.Script.Serialization.JavascriptSerializer jss = new System.Web.Script.Serialization.JavascriptSerializer();
//Do your model updating, then return the updated version
//Return a Json version of the model
return jss.Serialize(modelTest);
}
我相信问题是我的原始模型的复杂性和控制器方法的返回值的结合 我在视图中的ajax调用最终看起来像
var ajaxModelData = {
Name: "Bob",
City: "Mpls"
};
$.ajax({
url: '@Url.Action("AjaxCall", "Producer")',
type: "POST",
data: ajaxModelData, //modelJson, //JSON.stringify(Model),
success: function (data) {
console.log("success");
console.log(data);
console.log(data.City);
console.log(data.Name);
},
failure: function (data) {
console.log("failure");
},
error: function (jqxhr, textStatus, errorThrown) {
console.log(jqxhr);
console.log(textStatus);
console.log(errorThrown);
},
});
我的控制器方法如下所示
[HttpPost]
public ActionResult AjaxCall(RationGridAjaxModel data)
{
data.City += " this will be added and printed in web console from ajax success call";
return Json(data, JsonRequestBehavior.AllowGet);
}
我的控制器方法接受的RationalGridAjaxModel对象实际上只是一个新的模型类,我创建这个类是为了保存服务器端更新所需的值。我不知道为什么我不能用我的原始模型来实现它,当试图传入我的原始模型时,控制器方法上的断点永远不会被击中。我猜这是原始模型中存在的某些方法或依赖项的问题。您希望从控制器返回什么?最终,想法是将模型参数作为JSON,在控制器中使用模型方法更新它们,然后返回一个JSON对象,其中包含视图的更新模型参数。我在下面提供了一个答案,它应该可以完成您想要的。Ryan,感谢您的回复。这确实解决了我在传递模型时无法命中控制器断点的问题。现在可以了:)。我仍然收到ajax调用错误,错误消息为:[object object]parsererror SyntaxError:JSON.parse error:位置0处出现意外输入,@Andrewillette我更新了答案,使用JavascriptSerializer类对象序列化模型并将其发送回,我将返回类型更改为string,并使用序列化程序将模型转换为JSONstring@AndrewWillette这有帮助吗?嘿,Ryan,不幸的是,它没有解决我的问题,但它确实引导我朝着正确的方向前进,返回值是一个问题。我将发布我得出的解决方案。非常感谢您的帮助。@Andrewillette返回值有什么问题?