Jquery parseJSON未捕获语法错误:意外标记u
几个多小时以来,这个问题一直让我有点发疯。我已经读了很多帖子和文章,现在我对这个问题有了模糊的理解,但对原因却没有了。我意识到问题在于,当我在一个未定义的对象上提交类似JSON.parse的东西时。我不明白为什么会这样。我相信这是非常简单的,我相信一旦它被指出,我会感觉到一个工具,但现在我不介意感觉有点傻,如果它解决了问题 问题是,当我使用以下方法提交表单时,会出现以下错误:Jquery parseJSON未捕获语法错误:意外标记u,jquery,json,asp.net-mvc-4,Jquery,Json,Asp.net Mvc 4,几个多小时以来,这个问题一直让我有点发疯。我已经读了很多帖子和文章,现在我对这个问题有了模糊的理解,但对原因却没有了。我意识到问题在于,当我在一个未定义的对象上提交类似JSON.parse的东西时。我不明白为什么会这样。我相信这是非常简单的,我相信一旦它被指出,我会感觉到一个工具,但现在我不介意感觉有点傻,如果它解决了问题 问题是,当我使用以下方法提交表单时,会出现以下错误: Uncaught SyntaxError: Unexpected token u js:1 i.extend.parse
Uncaught SyntaxError: Unexpected token u js:1
i.extend.parseJSON js:1
c js:1
u js:1
n.extend.showLabel js:1
n.extend.defaultShowErrors js:1
n.extend.showErrors js:1
n.extend.form js:1
n.extend.valid js:1
(anonymous function)
i.event.dispatch js:1
y.handle
另外,当我将光标从一个字段移动到另一个字段时,会出现以下错误:
Uncaught SyntaxError: Unexpected token u js:1
i.extend.parseJSON js:1
c js:1
u js:1
n.extend.showLabel js:1
n.extend.defaultShowErrors js:1
n.extend.showErrors js:1
n.extend.element js:1
n.extend.defaults.onfocusout js:1
r js:1
(anonymous function) js:1
i.event.dispatch js:1
y.handle js:1
i.event.trigger js:1
i.event.simulate js:1
f
这显然阻止我将表单提交给控制器进行处理。
当jquery库尝试返回n.JSON.parse(t)时,错误似乎来自jquery库(第498行);(t未定义)。
我使用的是jquery1.9.1、bootstrap 2.2.2和jqValidate/1.9.0.unobtrusive.js。表单处于引导模式,如下所示:
@model AModelTestApp.Models.UserModel
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
<h3>User</h3>
</div>
<div class="modal-body">
@{
var ajaxOptions = new AjaxOptions
{
HttpMethod = "POST",
OnComplete = "Complete"
};
}
@using (Ajax.BeginForm("EditUser", "Home", ajaxOptions, new { id = "userform" }))
{
<div class="row-fluid">
<div class="span12">
@Html.ValidationSummary("Ooops..", new { id = "validateuser", @class = "alert alert-error" })
</div>
</div>
<div class="row-fluid">
<div class="span6">
@Html.LabelFor(m => m.Id)
@Html.TextBoxFor(m => m.Id)
@Html.LabelFor(m => m.Username)
@Html.TextBoxFor(m => m.Username)
@Html.LabelFor(m => m.FirstName)
@Html.TextBoxFor(m => m.FirstName)
@Html.LabelFor(m => m.LastName)
@Html.TextBoxFor(m => m.LastName)
</div>
<div class="span6">
@Html.LabelFor(m => m.Email)
@Html.TextBoxFor(m => m.Email)
@Html.LabelFor(m => m.UserTypeId)
@Html.TextBoxFor(m => m.UserTypeId)
@Html.LabelFor(m => m.Created)
@Html.TextBoxFor(m => m.Created)
@Html.LabelFor(m => m.Active)
@Html.CheckBoxFor(m => m.Active)
</div>
</div>
<div class="row-fluid">
<div class="span1 offset10">
<a id="btnclear" class="btn" href="#">Clear</a>
</div>
</div>
}
</div>
<div class="modal-footer">
<a class="btn" data-dismiss="modal" href="#">Close</a>
<a id="btnsubmit" class="btn btn-info" href="#">Submit</a>
</div>
<script type="text/javascript">
$.validator.unobtrusive.parse($('#userform'));
$('#btnclear').click(function() {
$('input').val('');
$(':checkbox').prop('checked', false);
return false;
});
$('#btnsubmit').click(function () {
$('#userform').validate();
if ($('#userform').valid()) {
$('#userform').submit();
} else {
alert("Something went wrong with the validation")
}
});
function Complete(result) {
alert("Woooo - " + result);
}
</script>
<div class="row-fluid">
<div class="span12">
<button id="btnclick" class="btn btn-large btn-block btn-primary">Click Me</button>
</div>
</div>
<div id="mainmodal" class="modal hide fade"></div>
<script type="text/javascript">
$('#btnclick').click(function () {
$.ajax({
url: '@Url.Action("GetUser", "Home")',
type: 'GET',
success: function (result) {
//awss.modal.popup(result);
$('#mainmodal').html(result);
$('#mainmodal').modal('show');
}
});
return;
});
</script>
ClientValidationEnabled和UnobtrusiveJavaScriptEnabled都在web.config中启用。
我希望这只是我在同一个问题上看得太久而看不到明显的问题。非常感谢您的帮助。
谢谢:)你能试试下面的吗
'$.parseJSON(result)'
在ajax成功函数中使用parsejson。不确定这是否适用于这种情况,但我发现了类似这样的零星问题,并进行了不引人注目的验证 其中包含ValidationSummary元素,因此这可能不适用。。但我看到它的时候,我没有包含验证消息元素 我已经有一段时间没有意识到这一点了,但据我回忆,我甚至需要为复选框等看似无害的东西添加信息。看起来被解析的JSON可能被期望包含本应保存验证消息的元素,如果该元素未定义,则一旦到达该“u”,解析就会失败 因此,对于您的代码,可以尝试以下方式:
<div class="row-fluid">
<div class="span6">
@Html.LabelFor(m => m.Id)
@Html.TextBoxFor(m => m.Id)
@Html.ValidationMessageFor(m => m.Id)
@Html.LabelFor(m => m.Username)
@Html.TextBoxFor(m => m.Username)
@Html.ValidationMessageFor(m => m.Username)
@Html.LabelFor(m => m.FirstName)
@Html.TextBoxFor(m => m.FirstName)
@Html.ValidationMessageFor(m => m.FirstName)
@Html.LabelFor(m => m.LastName)
@Html.TextBoxFor(m => m.LastName)
@Html.ValidationMessageFor(m => m.LastName)
</div>
<div class="span6">
@Html.LabelFor(m => m.Email)
@Html.TextBoxFor(m => m.Email)
@Html.ValidationMessageFor(m => m.Email)
@Html.LabelFor(m => m.UserTypeId)
@Html.TextBoxFor(m => m.UserTypeId)
@Html.ValidationMessageFor(m => m.UserTypeId)
@Html.LabelFor(m => m.Created)
@Html.TextBoxFor(m => m.Created)
@Html.ValidationMessageFor(m => m.Created)
@Html.LabelFor(m => m.Active)
@Html.CheckBoxFor(m => m.Active)
@Html.ValidationMessageFor(m => m.Active)
</div>
</div>
@LabelFor(m=>m.Id)
@Html.TextBoxFor(m=>m.Id)
@Html.ValidationMessageFor(m=>m.Id)
@LabelFor(m=>m.Username)
@Html.TextBoxFor(m=>m.Username)
@Html.ValidationMessageFor(m=>m.Username)
@LabelFor(m=>m.FirstName)
@Html.TextBoxFor(m=>m.FirstName)
@Html.ValidationMessageFor(m=>m.FirstName)
@LabelFor(m=>m.LastName)
@Html.TextBoxFor(m=>m.LastName)
@Html.ValidationMessageFor(m=>m.LastName)
@LabelFor(m=>m.Email)
@Html.TextBoxFor(m=>m.Email)
@Html.ValidationMessageFor(m=>m.Email)
@LabelFor(m=>m.UserTypeId)
@Html.TextBoxFor(m=>m.UserTypeId)
@Html.ValidationMessageFor(m=>m.UserTypeId)
@LabelFor(m=>m.Created)
@Html.TextBoxFor(m=>m.Created)
@Html.ValidationMessageFor(m=>m.Created)
@LabelFor(m=>m.Active)
@CheckBoxFor(m=>m.Active)
@Html.ValidationMessageFor(m=>m.Active)
只需添加以下代码问题的发生是因为没有显示错误消息的范围
$('input[name],select[name]').each(function ()
{
if ($(this).attr('name') != '')
{
if ($(this).closest('div').find('span[data-valmsg-for=' + $(this).attr('name') + ']').length == 0)
{
$(this).closest('div').append('<span class="field-validation-valid error_msg" data-valmsg-for="' + $(this).attr('name') + '" data-valmsg-replace="true"></span>');
}
}
})
$('input[name],select[name]')。每个(函数()
{
if($(this.attr('name')!=“”)
{
if($(this).closest('div').find('span[data valmsg for='+$(this.attr('name')+'])).length==0)
{
$(this.closest('div')。append(“”);
}
}
})
如评论中所述,jquery 1.9与jquery非侵入性验证存在不兼容问题。通过在浏览器控制台窗口中输入以下代码,可以快速检查是否存在此问题:
JSON.parse(undefined)
如果你得到
未捕获的语法错误:JSON中位于位置0的意外标记u
。。。那你就有问题了。要解决此问题,请将迁移库添加到页面中的jquery下面:
<script src="http://code.jquery.com/jquery-1.9.1.js"></script>
<script src="http://code.jquery.com/jquery-migrate-1.4.1.js"></script>
错误应该消失,并替换为控制台警告。此版本用于调试,因此,如果希望警告完全消失,请指向迁移库.min文件:
<script src="http://code.jquery.com/jquery-1.9.1.js"></script>
<script src="http://code.jquery.com/jquery-migrate-1.4.1.min.js"></script>
更多关于在jquery migrate打开的情况下将代码迁移到jquery 1.9+的信息,请参见。将jquery.migrate添加到脚本列表中,您认为这应该会对itjquery 1.9+进行排序,因为它会导致不引人注目的ajax和验证库出现问题。迁移包添加了1.8+系列jquery中的功能。将
jquery.Validation
包更新为1.13.0和jquery.Validation。不引人注目的包更新为2.0.20710.0为我解决了这个问题。没有人再回答问题了吗?;)@你应该加上这个作为回答-救了我的命!这段代码帮助我找到问题所在,在我的例子中,这是一个没有属性名的输入。
<script src="http://code.jquery.com/jquery-1.9.1.js"></script>
<script src="http://code.jquery.com/jquery-migrate-1.4.1.min.js"></script>