2013-04-03 97 views
19

我的控制器:郵政JavaScript數組與AJAX到ASP.NET MVC控制器

[HttpPost] 
public ActionResult AddUsers(int projectId, int[] useraccountIds) 
{ 
    ... 
} 

我想參數發佈到通過AJAX控制器。通過int projectId不是問題,但我無法設置發佈int[]

我的JavaScript代碼:

function sendForm(projectId, target) { 
    $.ajax({ 
     traditional: true, 
     url: target, 
     type: "POST", 
     data: { projectId: projectId, useraccountIds: new Array(1, 2, 3) }, 
     success: ajaxOnSuccess, 
     error: function (jqXHR, exception) { 
      alert('Error message.'); 
     } 
    }); 
} 

我與測試數組,但沒有成功嘗試。 :( 我也試着設置traditional: true,或contentType: 'application/json; charset=utf-8'但沒有成功,以及...

int[] useraccountIds貼到我的控制器總是空

+0

請發佈錯誤消息 – Mortalus

+0

我已經調試了控制器方法,並且int [] useraccounts始終爲空。 – mosquito87

+0

總是最好查看發送的實際數據。要麼獲取Fiddler,要麼查看網絡下的開發人員工具(即Firefox/Firebug的Chrome)。 – samjudson

回答

34

你可以定義一個視圖模型:

public class AddUserViewModel 
{ 
    public int ProjectId { get; set; } 
    public int[] userAccountIds { get; set; } 
} 

然後適應您的控制器動作藉此視圖模型作爲參數:

[HttpPost] 
public ActionResult AddUsers(AddUserViewModel model) 
{ 
    ... 
} 

最後調用它:

function sendForm(projectId, target) { 
    $.ajax({ 
     url: target, 
     type: 'POST', 
     contentType: 'application/json', 
     data: JSON.stringify({ 
      projectId: projectId, 
      userAccountIds: [1, 2, 3] 
     }), 
     success: ajaxOnSuccess, 
     error: function (jqXHR, exception) { 
      alert('Error message.'); 
     } 
    }); 
} 
+0

即使是硬編碼的projectId(如23)也不會發送到控制器。 而是發送真實的表單數據(還有一個項目ID)。 :( – mosquito87

+1

這個'sendForm'函數在那裏,你在哪裏調用它?它是在某個表單的提交事件還是某個提交按鈕的點擊事件?你確定通過返回false來取消該事件的默認操作我想你沒有。 –

+0

是的,你是完全正確的。什麼愚蠢的錯誤。我很抱歉... – mosquito87

0

如果你想傳遞數組到mvc引擎,多次發送輸入。更改您的代碼如下:

function sendForm(projectId, target) { 
var useraccountIds = new Array(1, 2, 3); 
var data = { projectId: projectId }; 
for (var i = 0; i < useraccountIds.length; i++) { 
    $.extend(true, data, {useraccountIds: useraccountIds[i]}); 
} 
$.ajax({ 
    traditional: true, 
    url: target, 
    type: "POST", 
    data: data, 
    success: ajaxOnSuccess, 
    error: function (jqXHR, exception) { 
     alert('Error message.'); 
    } 
}); 

}

+0

根據firebug中的網絡監視器,AJAX發送的數據確實在表單中,但不是我用數據指定的數據... – mosquito87

+0

是的,我找到了解決方案,並且編輯了我的答案,但是我的代碼沒有經過測試,但是這是解決方案 – Rabolf

0

把Serializable屬性的類。然後它會嘗試將您傳遞給C#類的JavaScript對象轉換。

在JS:

{ 
    ProjectId = 0, 
    userAccountIds = [] 
} 

// C# 
[Serializable] 
public class AddUserViewModel 
{ 
    public int ProjectId { get; set; } 
    public int[] userAccountIds { get; set; } 
} 
+0

這個工作沒有viewmodel嗎? – mosquito87

+0

是的,具有Seri​​alizable屬性的普通類就足夠了。 – marko

2

使用$。阿賈克斯(),您可以輕鬆地從JavaScript中的數據得到MVC中的控制器。

作爲等,

var uname = 'John Doe'; 

$.ajax({ 

     url: "/Main/getRequestID", // This is path of your Controller with Action Result. 
     dataType: "json",   // Data Type for sending the data 

     data: {      // Data that will be passed to Controller 
      'my_name': uname,  // assign data like key-value pair  
      // 'my_name' like fields in quote is same with parameter in action Result 
     }, 

     type: "POST",    // Type of Request 
     contentType: "application/json; charset=utf-8", //Optional to specify Content Type. 

     success: function (data) { // This function is executed when this request is succeed. 
       alert(data); 
     }, 

     error: function (data) { 
       alert("Error"); // This function is executed when error occurred. 
     } 
)}; 

然後,在控制器側,

public ActionResult getRequestID(String my_name) 
{ 

    MYDBModel myTable = new Models.MYDBModel(); 
    myTable.FBUserName = my_name; 
    db.MYDBModel.Add(myTable); 
    db.SaveChanges();    // db object of our DbContext.cs 
    //return RedirectToAction(「Index」); // After that you can redirect to some pages… 
    return Json(true, JsonRequestBehavior.AllowGet); // Or you can get that data back after inserting into database.. This json displays all the details to our view as well. 
} 

參考。 Send Data from Java Script to Controller in MVC

+0

鏈接已損壞。 – JoshYates1980

+0

謝謝喬希更新我.. 我已更新鏈接。請檢查。其實我已經把我的博客從Wordpress轉移到博主。所以這個鏈接被打破了。現在它的工作.. –

14

在JS:

var myArray = new Array(); 
myArray.push(2); 
myArray.push(3); 
$.ajax({ 
      type: "POST", 
      url: '/MyController/MyAction', 
      data: { 'myArray': myArray.join() }, 
      success: refreshPage 
     }); 

在MVC中/ C#:

public PartialViewResult MyAction(string myArray) 
{ 
    var myArrayInt = myArray.Split(',').Select(x=>Int32.Parse(x)).ToArray(); 
    //My Action Code Here 
} 
0

,除非你指定它不會工作的Ajax請求(郵政/ GET)有屬性 traditional設置爲true。 有關更多詳情,請參閱此question

相關問題