用jQuery $ .ajax验证ASP.NET MVC验证
-
08-10-2019 - |
题
我有一种情况,我将数据通过jQuery $ .ajax发送到控制器,数据是一个序列化的JSON字符串。 (MVC 3.0)
它可以很好地绑定它 - 我的控制器收到结果,它们是正确的。现在,我在发布后验证验证方面遇到了问题。我怀疑这是因为并非我所有的对象都必须本地形成控制。
问题在于我必须使用JavaScript将数据“添加”到我的模型中,因为该模型需要集合中的项目。使用JavaScript,jQuery和模板,我选择了此项目,然后将其添加到模型中,然后将其发送给控制器。但是,在寄回时,这些数据并不存在(这是可以预料的,因为它必须将其归为JavaScript数组 - 这不是我的问题)。
我的问题是它执行双重验证验证,或者根本没有。如果我使用
e.preventDefault();
为了停止正常表格发布,我永远不会得到验证。但是,如果我不使用它,那我 总是 获取双帖子,最终在我看来永远不会重定向。
我的jQuery代码如下。
$('form').submit(function(e){
var data = $('form').serializeObject();
data.Quality = // this line adds some data from a JSON object.
var json = JSON.stringify(data);
$.ajax({
url: location.href,
type: 'POST',
dataType: 'json',
data: json,
contentType: 'application/json',
success: function (data) {
$("#jsonOutput").html(json);
}
});
e.preventDefault();
});
这是serializeObject函数。
$.fn.serializeObject = function () {
var o = {};
var a = this.serializeArray();
$.each(a, function () {
if (o[this.name]) {
if (!o[this.name].push) {
o[this.name] = [o[this.name]];
}
o[this.name].push(this.value || '');
} else {
o[this.name] = this.value || '';
}
});
return o;
};
这是我的控制器动作。
[HttpPost]
public ActionResult Blueprint(Blueprint blueprint)
{
if (ModelState.IsValid)
{
using (var context = new Mapping.DataContext())
{
context.Blueprints.Add(blueprint);
context.SaveChanges();
return Json(Redirect("/List/Blueprints"));
}
}
return View(blueprint);
}
如果要求,我将发布更多代码,但是我认为这是相关的。我正在使用图书馆 knockoutjs
对于模板,如果这完全相关。请告诉我,如果适用,您还需要查看什么。
解决方案
$("#jsonOutput").html(json);
就双重职位而言,这是因为您的活动处理程序提交请求和实际表格提交。为了摆脱这个问题,您想要这样的东西:
$('form').submit(function(e){
var data = $('form').serializeObject();
data.Quality = // this line adds some data from a JSON object.
var json = JSON.stringify(data);
$.ajax({
url: location.href,
type: 'POST',
dataType: 'json',
data: json,
contentType: 'application/json',
success: function (data) {
$("#jsonOutput").html(json);
}
});
return false;
});
返回false,将告诉防止事件在您告诉系统已经处理时通过表单处理。
我在做什么时看到的另一个问题是,您是通过设置Datatype来要求JSON:“ JSON”这意味着您的请求正在期待JSON对象,并且在验证失败的情况下,您正在返回完整视图。这可能不是您想做的。
另请注意:
$("#jsonOutput").html(json);
被称为成功响应的正在加载您正在请求发送的JSON的值,而不是响应中的数据。