这个问题一直让我疯狂了几个小时。我现在阅读了很多帖子和文章,我对这个问题有一个模糊的理解,但不是原因。我意识到问题是当我在一个未定义的对象上提交类似JSON.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
这显然阻止我将表单提交给控制器进行处理。 当它试图:返回n.JSON.parse(t)时,错误似乎来自jquery库(第498行)。 (t未定义)。 我正在使用jquery 1.9.1,bootstrap 2.2.2和jqValidate / 1.9.0.unobtrusive.js。表单采用bootstrap模式,如下所示:
@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>
从这个控制器:
public ActionResult GetUser()
{
var user = new UserModel
{
Id = 1,
Username = "sbody",
FirstName = "Some",
LastName = "Body",
Email = "sbody@domain.com",
UserTypeId = 6,
Created = new DateTime(2013, 1, 1),
Active = true
};
return PartialView("EditUser", user);
}
在web.config中启用了ClientValidationEnabled和UnobtrusiveJavaScriptEnabled。 我希望这只是我长时间看同一问题并且看不到明显问题的情况。任何帮助非常感谢。 谢谢:))
答案 0 :(得分:1)
您可以尝试以下
'$.parseJSON(result)'
在你的ajax成功函数中使用parsejson。
答案 1 :(得分:1)
不确定这是否适用于这种情况,但是我发现这样的零星问题具有不显眼的验证。
你有一个ValidationSummary元素,所以这可能不适用..但是当我没有包含Validation Message元素时,我看到它的时间。
我偶然发现了这一段时间,但从我记得的情况来看,我甚至需要为看似无害的东西添加信息,比如复选框。好像被解析的JSON似乎可能包含了应该保存验证消息的元素,如果那是 undefined ,那么一旦它达到'u'就失败了解析”。
因此,对于您的代码,可以尝试这样的事情:
>>> def fib(self, a,b):
... self.i=a, self.j=b
... print self.i+self.j
...
>>> fib(4,8)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: fib() takes exactly 3 arguments (2 given)
>>> fib(4,8,9)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in fib
AttributeError: 'int' object has no attribute 'i'
答案 2 :(得分:0)
添加以下代码由于无法显示错误消息
,因此发生问题 $('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>');
}
}
})
答案 3 :(得分:0)
如评论中所述,jquery 1.9与jquery非侵入式验证存在不兼容问题。通过将以下代码放在浏览器控制台窗口中,可以快速检查是否有此问题:
JSON.parse(undefined)
如果得到
未捕获的SyntaxError: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>
有关在GitHub上使用jquery-migrate将代码迁移到1.9+的更多信息。