2013-07-24 56 views
0

以下是我現在面臨的情況。我在我的MVC控制器動作,看起來如下:使用IEnumerable進行AJAX請求的MVC綁定<string>

[HttpPost] 
public JsonResult MyAction(int id, IEnumerable<string> strings, bool trueFalse, string anotherString, bool anotherTrueFalse) {} 

我訪問此通過jQuery $.ajax電話如下:

$.ajax({ 
type: 'POST', 
dataType: 'json', 
contentType: 'application/json; charset=utf-8', 
data: {"id":12345,"strings":["onestring"],"trueFalse":false,"anotherString":"Woo String","anotherTrueFalse":false}, 
//Success/Error handlers here 
}); 

現在,我看到的問題是這樣的:不管正在發送的數據,id,trueFalse,anotherStringanotherTrueFalse都正確綁定當我調試我的控制器操作並檢查綁定到我的操作的參數。

的問題是與strings:如果我發送一個JSON陣列與一個字符串(如上),它永遠不會在我的行動勢必IEnumerable<string>。如果我把這樣的東西,而不是:

"strings":["onestring", "twostring"]

然後它被正確綁定爲IEnumerable有兩個條目。

這是怎麼回事,我錯過了什麼?

注:我剛剛試圖讓映射工作首先,所以它仍然有點混亂。我將通過將所有這五個屬性放入一個視圖模型來清理這個問題,這樣我就只需綁定一個對象 - 這可能會完全解決問題。但是,我仍然很好奇,當JSON數組只有一個條目時,這不起作用。

附錄1:在我上面的AJAX,這基本上是什麼在請求到服務器發送的,但我實際上構建對象,然後將它傳遞給JSON.stringify - 只是試圖使問題聲明儘可能簡單。您看到的是瀏覽器發送給控制器操作的內容。

附錄2:將所有這些屬性放到它們自己的視圖模型中已經清理了一些東西,但綁定問題仍然存在。另外,從IEnumerable<string>切換到string[]也會出現相同的問題,所以我基本上忽略了MVC如何爲我們執行模型綁定。

+0

我的答案能幫助你嗎? –

+0

它的確如此,謝謝。我會給你一個贊成票,並且現在把你的答案標記爲答案,除非有其他一些不那麼複雜的解決方案。 – Mattygabe

回答

1

問題是,當您收到一個元素的json數組時,它將被轉換爲普通的string。多個元素可以正確投射到IEnumerable。在JSON中,單個元素被視爲字典而不是數組。我建議使用JSON.NET來處理你的解析,因爲默認的模型綁定器會導致這個問題。

更多信息可以在這裏找到:https://stackoverflow.com/a/10122308/118224