Javascript Ajax调用失败,出现错误“0”;SyntaxError:JSON.parse错误:位置0处出现意外输入;

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

我在使用Ajax Post方法从视图成功调用控制器时遇到问题

以下是ajax调用:

            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返回值有什么问题?