0

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

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 上向我的控制器提交数据的正确方法是什么?

4

3 回答 3

3

根据我的评论,有几件事可能导致这种情况。

  1. 您已多次加载不显眼的文件
  2. 您的表单定义了一个操作方法,并且您的按钮在表单标记内作为提交按钮。这将提交表单,然后单击也将提交表单 - 参见示例

例子

<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 Helpers,请使用 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);
    }
}
于 2012-07-27T17:26:35.217 回答
1

您确定要阻止提交按钮的默认行为(表单 POSTING)吗?用来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");
               }
         }

});
于 2012-07-27T17:17:00.580 回答
1

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

于 2012-07-27T17:26:55.593 回答