2012-07-27 41 views
0

所以我有被利用轉化爲一個數組的表:MVC3 AJAX將數據傳遞給控制器​​。它被提交兩次

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上將數據提交給我的控制器的正確方法是什麼?

+0

看看您的加載腳本,並確保不顯眼的文件沒有被加載兩次。當這些事件被連接兩次時,我已經看到了這種情況。此外,按鈕「更新 - 註冊」提交類型按鈕?如果是這樣,那麼你正在勾選一個事件來點擊提交表單的按鈕,然後你正在進行另一個調用。你能提供表單的HTML嗎? – anAgent 2012-07-27 17:17:05

+0

是的,我必須這樣做?我有一個變量var結果....我需要作爲參數傳入,如果我沒有這樣做,它會出現NULL,我該如何解決這個問題?我寧願不掛鉤事件點擊按鈕。 – 2012-07-27 17:21:08

+0

請參閱下面的答案。 – anAgent 2012-07-27 17:29:09

回答

3

根據我的意見,有幾件事情可能導致這種情況。

  1. 你必須有不顯眼的文件(S)加載多次
  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輔助,使用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); 
    } 
} 
爲例
+0

其中是將var結果傳遞給我的控制器參數的代碼? – 2012-07-27 17:31:32

+0

由於您的示例未包含HTML代碼,因此我假設「#enrolledStudents」位於您的表單標記內。不是嗎? – anAgent 2012-07-27 17:55:17

+0

對不起。 #enrolledStudents是表格內的一個tbody的ID。我使用jQuery的可排序序列化錶行(這是工作)。我已將我的代碼更改爲與您的代碼類似,但現在我的控制器中的RedirectToAction不起作用。怎麼來的? – 2012-07-28 19:33:20

1

您確定您正在阻止提交按鈕的默認行爲(表單張貼)嗎?使用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"); 
       } 
     } 

}); 
+0

好吧,現在,我的控制器裏面的代碼返回RedirectToAction(「Index」);不起作用。我怎樣才能解決這個問題? – 2012-07-27 17:18:02

+0

由於這是一個ajax調用,RedirectoToAction不會工作,您可以發送一個JSON響應回到calle並使用它來重定向。代碼來.. – Shyju 2012-07-27 17:19:35

+0

@韋斯利帕蒂森;查看更新後的答案 – Shyju 2012-07-27 17:27:51

1

檢查您是否沒有加載jquery文件兩次。我有這種行爲,問題是文件加載兩次。

相關問題