我有一种情况,我将数据通过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的值,而不是响应中的数据。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top