2014-02-19 129 views
0

我已經使用了這個函數並檢查了所有的StackOverflow,但我必須缺少一些東西......我有一個簡單的按鈕點擊隱藏的不顯眼的jQuery。它計算複選框並將每個選中的框的值添加到數組中。當我在jQuery中使用警告框時,該列表是正確的,但數組從未將其發送到控制器端。該代碼流向控制器,但我打破了var resolutionViewModel = new ResolutionViewModel();並檢查trans - 參數爲null。我是jQuery的新手,可以真正使用這裏的幫助。無法將數組從jQuery發送到MVC 4控制器

jQuery的

// Return the selected transactions 

function resolveTransactions() { 

    $('#btnResolve').click(function() { 

     var selectedTransactions = new Array(); 

     $('input[name="chkTransaction"]:checked').each(function() { 
      selectedTransactions.push(this.value); 
     }); 

     if (selectedTransactions.length > 0) { 
      $.ajax({ 
       type: 'POST', 
       dataType: 'json', 
       url: 'http://localhost/AuditLog/Home/ResolutionFormDisplay', 
       contentType: 'application/json; charset=utf-8', 
       data: {trans : selectedTransactions}, 
       traditional: true, 
       success: function (data) { alert(data); }, 
       error: function(xhr, status, errorThrown) { alert("Error: " + errorThrown); } 
      }); 
     } 
    }); 
}; 

控制器側

[HttpPost] 
public PartialViewResult ResolutionFormDisplay(List<string> trans) 
{ 
    var resolutionViewModel = new ResolutionViewModel(); 

    // fill Usernames dropdown selector in ViewModel 
    // fill Status dropdown selector in ViewModel 
    // fill list of transactionIds in ViewModel 

    return PartialView("_ResolutionDialog", resolutionViewModel); 
} 
+0

我還看到錯誤提示框,上面寫着一個錯誤的翻譯: –

+0

只是注意的是,錯誤回調需要3個參數按照下面的順序:xhr,status,errorThrown,所以我會改變你的錯誤處理程序,所以傳入這些參數並警告,而不是轉換爲字符串的xhr,就像你注意到的那樣顯示[object Object]。 – Dismissile

+0

@Dismissile你的意思是這樣的: error:function(xhr,status,errorThrown){alert(「Status:」+ status +「Error:」+ errorThrown); } - 如果是這樣,它只是說錯誤:找不到。 –

回答

0

SOLUTION: $ .ajax回發未將格式正確的數據發送到控制器。我通過使用IE中的網絡選項卡並查看發佈的http的請求主體來發現此問題。它看起來像這樣:transaction_table_length = 10 & chkTransaction = 22 & chkTransaction = 23 - 它應該看起來像這樣:{「trans」:[「22」,「23」]}。爲了解決這個問題,我按如下所示對屬性名和數組進行了字符串化,將dataType更改爲'text',並使controller action方法中的參數採用String [] trans。

jQuery的

// Return the selected transactions 
function resolveTransactions() { 
    $('#btnResolve').click(function() { 

     var selectedTransactions = new Array(); 

     $('input[name="chkTransaction"]:checked').each(function() { 
      selectedTransactions.push(this.value); 
     }); 

     if (selectedTransactions.length > 0) { 
      $.ajax({ 
       type: 'POST', 
       dataType: 'text', 
       url: 'http://localhost/AuditLog/Home/ResolutionFormDisplay', 
       contentType: 'application/json; charset=utf-8', 
       data: JSON.stringify({ trans:selectedTransactions }), 
       traditional: true, 
       success: function (data) { alert(data); }, 
       error: function(xhr, status, errorThrown) { alert(" Error: " + errorThrown); } 
      }); 
     } else { 
      alert('You must select (check) at least one transaction to apply a resolution.'); 
      return false; 
     } 
     return false; 
    }); 
}; 

MVC 4控制器動作

[HttpPost] 
public PartialViewResult ResolutionFormDisplay(string[] trans) 
{ 
    var resolutionViewModel = new ResolutionViewModel(); 

    // fill Usernames dropdown selector in ViewModel 
    // fill Status dropdown selector in ViewModel 
    // fill list of transactionIds in ViewModel 

    return PartialView("_ResolutionDialog", resolutionViewModel); 
} 
2

試着讓你的控制器接受一個列表,而不僅僅是一個單一的字符串(因爲你沒有傳遞一個字符串):

[HttpPost] 
public PartialViewResult ResolutionFormDisplay(List<string> value) 
{ 
    var resolutionViewModel = new ResolutionViewModel(); 

    // fill Usernames dropdown selector in ViewModel 
    // fill Status dropdown selector in ViewModel 
    // fill list of transactionIds in ViewModel 

    return PartialView("_ResolutionDialog", resolutionViewModel); 
} 
+0

我做了改變科林和重新啓動後沒有區別。 (還是)感謝你的建議。 –

1

發佈的JSON需要在您的控制器方法中命名屬性與參數匹配。檢查Chrome瀏覽器開發工具的「網絡」選項卡,看到你發佈什麼,它可能是這樣的:

"{\"value\":\"...\"}" 

沒有value屬性來傳遞給你的控制器方法的參數value。我認爲最好的辦法就是擺脫「JSON.stringify」並接受一個像Colin的答案這樣的列表,但是如果你想把它作爲一個字符串,JSON字符串需要是一個對象的value屬性,而不是周圍的其他方法:

data: {value : JSON.stringify(selectedTransactions)}, 
+0

我擺脫了JSON.Stringify並將簽名更改爲列表但行爲沒有變化。試用Goggle Chrome網絡標籤並在標題中輸入數據列出數據。 –

+0

傑森,谷歌瀏覽器中的數據列出如下: transaction_table_length = 10&chkTransaction = 22&chkTransaction = 23&chkTransaction = 24&chkTransaction = 25&chkTransaction = 26&chkTransaction = 27&chkTransaction = 28&chkTransaction = 29&chkTransaction = 30&chkTransaction = 31 –

0

嘗試通過你的陣列如下:

data:"{'trans':" + JSON.stringify(selectedTransactions)+"}" 

你的方法應該如下:

public void Method(List<string> trans) 
{ 
    //Your implementation 
} 
+0

對不起,這是沒有效果的。 –

相關問題