2016-04-14 35 views
0

MVC 4似乎無法解析我發送的對象。MVC不解析請求中的IEnumerable值

使用jQuery的ajax函數,我使用POST請求發送數據。我收到的申請對象,看來像這樣在的Request.Form:

{Name=Test&Groups%5b0%5d%5bName%5d=GroupName1&Groups%5b0%5d%5bCount%5d=123Groups%5b1%5d%5bName%5d=GroupName2&Groups%5b1%5d%5bCount%5d=123ID=bee4c411-f06c-43c6-815f-8002df4f2779} 

//formatted for readability 
Name=Test & 
Groups[0][Name]=GroupName1 & 
Groups[0][Count]=123 & 
Groups[1][Name]=GroupName2 & 
Groups[1][Count]=123 & 
ID=bee4c411-f06c-43c6-815f-8002df4f2779 

NameID值分析得很好,但在組陣列是不是...我得到一個IEnumerable,它包含正確的組數,但其中的值是null

我讀過thisthis我似乎無法找到我做錯了什麼......

我缺少什麼?

的MVC Action看起來是這樣的:

public ActionResult UpdateGroups(GroupsListRequest req) 
{ 
    [...] //handle the request 
} 

GroupsListRequest看起來是這樣的:

public class GroupsListRequest 
{ 
    public string Name { get; set; } 
    public string ID { get; set; } 
    public IEnumerable<GroupRequest> Groups { get; set; } 
} 

最後,GroupsRequest看起來是這樣的:

public class GroupsRequest 
{ 
    public string Name { get; set; } 
    public int Count { get; set; } 
} 
+0

您的觀點是什麼樣的?或者你如何發送該對象,它應該表示什麼格式? – CodeCaster

+1

爲了綁定它需要'Groups [0] .Name:GroupName1&...' –

+0

@Stephen這種格式沒有意義,它將是'key = value',而不是'key:value'。 – CodeCaster

回答

1

試試這個

請求中的名稱和計數字段周圍的方括號刪除。

Name:Test & 
Groups[0].Name:GroupName1 & 
Groups[0].Count:123 & 
Groups[1].Name:GroupName2 & 
Groups[1].Count:123 & 
ID:bee4c411-f06c-43c6-815f-8002df4f2779 

您輸入的名字應該是這樣的

<input type="text" name="Groups[0].Name" value="George" /> 
+0

增加了一些文字描述 –

+0

沒錯!謝謝! –

0

那麼,作爲@sangramparmar和@stephenmuecke提到的,問題是與數組中的對象的格式 - 他們是由一個額外的包圍一對括號。

幾種情況而完成此問題的解決:

  • 我使用jQuery來將請求發送到所述服務器,並且param函數是一個由不正確地解析所述陣列(至少就造成問題的原因如C#的MVC而言
  • 到服務器的每個請求都需要有一個(會話常數)鍵添加到其數據發送請求之前,這是通過一個全球性的ajaxSetup
  • 自動執行出於某種原因,MVC失敗在我設置時讀取ajax請求的數據contentTypeapplication/json(至少,未能按照我預期的方式讀取它...其中,如果我曾經學到了什麼,在某些方面可能是誤導)

我結束了使用的解決方案是建立自己的stringify功能的數據對象解析爲一個字符串,像這樣:

stringify: function (obj, prefix) { 
    var objString = ''; 
    prefix = prefix || ''; 

    if(typeof(obj) === 'object') { 
     if (Array.isArray(obj)) { 
      _.each(obj, function (item, index) { 
       objString = objString + utilityMethods.stringify(item, prefix + '%5b' + index + '%5d'); 
      }); 
     } else { 
      if (prefix != undefined && prefix.length !== 0) { 
       prefix = prefix + '.'; 
      } 
      _.each(_.keys(obj), function (key) { 
       objString = objString + utilityMethods.stringify(obj[key], prefix + key); 
      }); 
     } 
    } else { 
     objString = objString + '&' + prefix + '=' + obj; 
    } 

    return objString; 
} 

然後,在全球ajaxSetup,我添加了一個beforeSend添加所需的關鍵,就像這樣:

beforeSend: function (jqXHR, settings) { 
    var userKeyString = 'userKey=' + [... fetch the user key...]; 
    if (settings.type.toUpperCase() === 'GET') { 
     settings.url = settings.url + '&' + userKeyString; 
    } else { 
     if (settings.data != undefined) { 
      settings.data = userKeyString + '&' + settings.data; 
     } 
    } 
}, 

現在,我結束了一個額外的符號每個請求。我最終會解決......也許。