繁体   English   中英

MVC3 AJAX将数据传递到控制器。 提交了两次

[英]MVC3 AJAX passing data to controller. It's being submitted twice

所以我有一个表,它使用以下方法转换为数组:

var result = $("#enrolledStudents").sortable('toArray');

但是当我大步前进时,将其传递到我的控制器中,如下所示:

$("#update-enroll").click(function () {
            var result = $("#enrolledStudents").sortable('toArray');
            $.ajax({
                url: '@Url.Action("Enrollment", "Classroom")',
                data: { students: result },
                type: 'POST',
                traditional: true
            });
        });

我的调试断点被触发两次,导致出现问题。 在POST上向我的控制器提交数据的正确方法是什么?

根据我的评论,可能有几方面的原因。

  1. 您已多次加载不干扰文件
  2. 您的表单具有已定义的操作方法,并且您的按钮作为提交按钮位于form标记内。 这将提交表单,然后单击还将提交表单-请参见示例

<form action="/somerowout/someaction">
  <input type="text" id="text1"/>
  <input type="text" id="text1"/>
  <input type="submit" />
</form>

如果需要在发布之前验证表单上的值,请不要挂断其他Ajax调用。 您的JavaScript如下所示:

$(document).ready(function () {
    $("form").submit(function(){
        var result = $("#enrolledStudents").sortable('toArray');
        if(result == null){
            //do something to show validation failed
            return false;
        }
        return true;        
    });
});

然后,您的表单代码将类似于:

@using (@Ajax.BeginForm(new AjaxOptions { })) { 
    <input type="text" id="text1"/>
    <input type="text" id="text1"/>
    <input type="submit" />
}

如果要使用Ajax而不是HTML Helper,请使用div而不是表单,并且不会收到重复的帖子。 这是实现此目标的方法:

<div id="enrolledStudents">
  <--! your elements -->
  <button id="saveStudents">Save</button>
</div>

JavaScript的

$(document).ready(function () {
    $("saveStudents").click(function(){
        var result = $("#enrolledStudents").sortable('toArray');
        if(result !== null){ /* do some kind of check here. */
            $.ajax({
                url: '@Url.Action("Enrollment", "Classroom")',
                data: { students: result },
                type: 'POST',
                traditional: true,
                success : function(data) {
                    if (data.status) {
                        window.location = data.route;
                    }               
                }
            })
        } else {
            /* notify ui that save didn't happpen */
        }           
    });
});

控制器操作示例使用Ajax发布数据时,这是如何传递路线的示例

[HttpPost]
public ActionResult SomethingPost(SomeModel model) {
    if (Request.IsAjaxRequest()) {
        var json = new {
                   status = true,
                   route = @Url.RouteUrl("MyRouteName", new { /* route values */ })
        };
        return Json(json, JsonRequestBehavior.AllowGet);
    }
}

您确定要阻止“提交”按钮的默认行为(表单发布)吗? 使用preventDefault这样做。

$("#update-enroll").click(function (e) {
  e.preventDefault();
 //rest of the code

});

编辑:根据评论

要在ajax处理程序中进行重定向,您需要将要在JSON响应中重定向的URL返回给被调用者。

[HttpPost]
public ActionResult Classroom(string students)
{
  //do some operaton
  if(Request.IsAjax())
  {
     //This is an Ajax call
     return Json(new
                   {
                     Status="Success",
                     NewUrl = Url.Action("Index","Home")
                   });
  }
  else
  {
     //Normal request. Use RedirectToActiom
      return RedirectToAction("Index","Home");
  }

}

现在,在您的ajax调用中,检查JSON结果并进行重定向。

 $.ajax({
         url: '@Url.Action("Enrollment", "Classroom")',
         data: { students: result },
         type: 'POST',           
         dataType: "json",
         contentType: "application/json; charset=utf-8",
         success: function (data) {
               if(data.Status=="Success")
               {
                  window.location.href = data.Newrl;
               }
               else
               {
                   alert("some error");
               }
         }

});

检查是否没有两次加载jquery文件。 我有此行为,问题是文件加载了两次。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM