jQuery post导致Uncaught SyntaxError:意外的令牌:

时间:2011-02-25 09:33:00

标签: javascript asp.net-mvc jquery

我在这里发现了一堆类似的问题但经过3个小时的阅读和尝试后,我发布了自己的问题。我为复制道歉,但我不知道这里发生了什么。

所以我有这个javascript函数:

function saveSetting(settingName, settingValue) {
    $.post(
        appUrl + "Account/SaveSetting",
        { settingName: settingName, settingValue: settingValue },
        function (data) {
            alert(data.Result);
        },
        "json"
    );
}

我称之为:

saveSetting("bookFontSize", fontSize);

其中fontSize是“10.5”或类似的东西。

Chrome报告的帖子标题如下:

Request URL:http://localhost:1227/Account/SaveSetting?callback=jQuery151022712289774790406_1298625531801
Request Method:POST
Status Code:200 OK
Request Headers
Accept:text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Connection:keep-alive
Content-Length:42
Content-Type:application/x-www-form-urlencoded
Cookie:ASP.NET_SessionId=jwpzp4okerckuh2bhkl2pnwu; .ASPXAUTH=429EEA1CFBFD9D5702011C59F77F18F8DAEEEB412314D608E86289779DF8ED9C80C6E0370B7108D68C44B088C7CB6998F34C59DDCFF8EA9D4A556495F5D40DF21737392DCF5942F73726882BEC354C35599864F751751FD458473FA4541AF25294F7E16DC00AABD4DEC43B321B0ECCBF195FD419C3BC912017275FC478A27F0C12A28D124A663EA5F19E5AEFFB276603
Host:localhost:1227
Origin:http://localhost:1227
Referer:http://localhost:1227/Read/116/1
User-Agent:Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.98 Safari/534.13
X-Requested-With:XMLHttpRequest
Query String Parameters
callback:jQuery151022712289774790406_1298625531801
Form Data
settingName:bookFontSize
settingValue:10.5
Response Headers
Cache-Control:private, s-maxage=0
Connection:Close
Content-Length:38
Content-Type:application/json; charset=utf-8
Date:Fri, 25 Feb 2011 09:18:53 GMT
Server:ASP.NET Development Server/10.0.0.0
X-AspNet-Version:4.0.30319
X-AspNetMvc-Version:3.0

这是一个C#/ ASP.NET MVC3动作,如下所示:

[Authorize]
public JsonResult SaveSetting(string settingName, string settingValue)
{
    try
    {
        repository.SaveSettingForUser(CurrentUser, settingName, settingValue);
    }
    catch (Exception ex)
    {
        return Json(new { Result = CurrentUser.IsAdmin() ? "Failed :" + ex.Message : "Failed" });
    }
    return Json(new { Result = string.Format("Set {0} to {1}.", settingName, settingValue) });
}

根据chrome的说法,它会返回:

{"Result":"Set bookFontSize to 10.5."}

对我来说看起来像合法的json。但是,我在chrome中遇到了这个错误:

Uncaught SyntaxError: Unexpected token :

和IE 7中的这个,以及8:

An error has occurred in the script on this page.
Line: 67456553
Char: 10
Error: Expected ';'
Code: 0
URL: http://localhost:1227/Read/116/1

我绝对没有6700万行代码:)

无论如何,有谁知道这里到底发生了什么?我的提醒没有运行。 IE实际上从未实际获得请求,但Chrome确实如此。

我认为很久以前这个函数实际上与jQuery的早期版本一起工作,设置为$.ajaxSettings.traditional = true,但现在它不起作用(jQuery 1.5.1),有或没有设置。

更新:我搞定了。我通过调试器逐步完成了javascript。出于某种原因,在jQuery中的.ajax()调用期间,它正在进入jquery.validate.js。为什么会这样做?我已经包含了该文件,但未在任何地方使用它。我通过简单地不再引用jquery.validate.js来消除错误。但是这种情况很糟糕,因为如果我想在将来使用验证功能怎么办?

所以现在我的问题是“为什么我的项目中有jquery.validate.js搞砸了所有内容?”

更新2 :jquery.validate.js中存在一个错误,现在已在github上的该项目的分支中修复。详情请见我的回答。我甚至没有使用该文件的验证功能,只是将其包含在页面中供以后使用。它阻碍了事情的发展。关于修复的jquery.validate.js的作者请注意:“使用jQuery.ajaxSettings修复jQuery 1.5-代码而不是window.ajaxSettings(是的,那是愚蠢的)。”

6 个答案:

答案 0 :(得分:20)

我明白了!!!

这是jquery.validate.js中的一个错误。这里重复并记录:http://bugs.jquery.com/ticket/8064

作者已于2011年2月2日解决了该问题,但此修复程序尚未成为该插件的正式版本(截至2011年2月25日和jQuery Validate 1.7)。如果你想在使用jquery验证时使用jQuery 1.5+ JSON,你应该下载修补的验证插件。

https://github.com/jaubourg/jquery-validation/raw/master/jquery.validate.js https://github.com/jaubourg/jquery-validation/raw/master/jquery.validate.min.js

如果您来自谷歌并且以上链接不再起作用,升级到大于1.7的验证版本可能会有效。或者,转到此处https://github.com/jaubourg/jquery-validation并从存储库中获取最新版本。

2011-08-31更新:看起来他们不再使用GitHub链接了。 I think this is what you need.

答案 1 :(得分:1)

您将帖子声明为json,因此必须自动评估结果。

尽管如此,请尝试在警报括号内的警报之前评估结果

eval(data.Result)

答案 2 :(得分:0)

是否可以在某些浏览器中动态设置对象键名?尝试将saveSetting更改为以下内容:

function saveSetting(settingName, settingValue) {
    $.post(
        appUrl + "Account/SaveSetting",
        { "settingName": settingName, "settingValue": settingValue },
        function (data) {
            alert(data.Result);
        },
        "json"
    );
}

或者可能将参数名称更改为对象键名称以外的其他名称:

function saveSetting(settingNameArg, settingValueArg) {
    $.post(
        appUrl + "Account/SaveSetting",
        { settingName: settingNameArg, settingValue: settingValueArg },
        function (data) {
            alert(data.Result);
        },
        "json"
    );
}

答案 3 :(得分:0)

您从服务器返回错误的JSON。您返回的JSON在Result中有一些控制字符。建议发送不带new String.format

的字符串

答案 4 :(得分:0)

永远不要对网址进行硬编码。在处理网址时始终使用网址助手。也不要提供绝对URL,因为jQuery认为它是JSONP(请注意请求中的callback=jQuery151022712289774790406_1298625531801参数),而响应只是JSON:

function saveSetting(settingNameArg, settingValueArg) {
    $.post(
        '<%= Url.Action("SaveSetting", "Account") %>',
        { settingName: settingNameArg, settingValue: settingValueArg },
        function (data) {
            alert(data.Result);
        },
        'json'
    );
}

另请注意,您的函数参数名为settingNameArgsettingValueArg,而您使用的代码是settingNamesettingValue

答案 5 :(得分:0)

我正在使用它:

// The Actionresult is being called by an Ajax Call:
    public ActionResult SomePartial(Object model)
    {
    return Json(new { state="Success", date="some data" });
    }

//OnSuccess of the Ajax Call:
    function OnSuccess(ajaxContext) {
    var result = eval(ajaxContext);
    if (result.state == "Success") {
    console.log(result.data)
    }
            else {
                // ERRORS
            }

        }

这将返回一个有效的json对象并显示它:)

也nb验证你的json http://jsonlint.com/