2017-02-02 19 views
2

我想通過jquery ajax調用發佈一個包含多個列表/字符串數組的複雜對象。只有對象的標量屬性似乎被映射,而不是數組。如何將包括列表在內的複雜對象發佈到ASP Web Api 2

我已經做了一些搜索,但找不到任何示例或解決方案,以確切的情況。

網頁API方法:

[HttpPost] 
public IHttpActionResult Save(MenuSearchGuideEntry model) 
{ 
    //Do stuff 
    return Ok(""); 
} 

MenuSearchGuideEntry對象:

[Table("MENUSOEGNING_GUIDE")] 
public class MenuSearchGuideEntry 
{ 
    [Key] 
    [Column("RAEKKEID")] 
    [Display(Name="Række id")] 
    public Decimal RowId { get; set; } 

    [Display(Name = "Label id")] 
    [Column("LABELID")] 
    public int? LabelId { get; set; } 

    [Column("ACTION")] 
    [Display(Name = "Action")] 
    public string JsonAction { get; set; } 

    [Column("FORCESEARCH")] 
    [Display(Name = "Tving søgning")] 
    public bool ForceSearch { get; set; } 

    [Column("ORD")] 
    [Display(Name = "Søgeord")] 
    public string SearchKeysString { get; protected set; }   
    public List<string> SearchKeys 
    { 
     get 
     { 
      return ToStringList(SearchKeysString, ' '); 
     } 
     set 
     { 
      SearchKeysString = value.Aggregate<string>((a, b) => a + " " + b); 
     } 
    } 


    [Column("SKJULTEFIRMAER")] 
    [Display(Name = "Skjulte firmaer")] 
    public string HiddenCompaniesString { get; protected set; } 
    public List<string> HiddenCompanies 
    { 
     get 
     { 
      return ToStringList(HiddenCompaniesString, ' '); 
     } 
     set 
     { 
      HiddenCompaniesString = value.Aggregate<string>((a, b) => a + " " + b); 
     } 
    } 
    [Column("SKJULTEDOMAENER")] 
    [Display(Name = "Skjulte domæner")] 
    public string HiddenDomainsString { get; protected set; } 
    public List<string> HiddenDomains 
    { 
     get 
     { 
      return ToStringList(HiddenDomainsString, ' '); 
     } 
     set 
     { 
      HiddenDomainsString = value.Aggregate<string>((a, b) => a + " " + b); 
     } 
    } 
    [Column("PRIORITET")] 
    [Display(Name = "Prioritet")] 
    public int? Priority { get; set; } 


    private List<string> ToStringList(string separatedString, char separator) 
    { 
     return string.IsNullOrEmpty(separatedString) 
      ? new List<string>() 
      : eparatedString.Split(separator).ToList(); 
    } 
} 

Jquery的Ajax調用:通過Ajax張貼

function ajaxPost(data, url, redierctUrl) { 
    $.ajax({ 
     url: url, 
     data: JSON.stringify(data), 
     type: 'POST',   
     contentType: 'application/json', 
     success: function() { 
      window.location.href = redierctUrl; 
     }, 
     error: function (msg) { 

     } 
    }); 
} 

對象:

{ 
    "RowId":"1920", 
    "priority":"", 
    "labelId":"9999", 
    "forcesSearch":"False", 
    "jsonAction":"KBA TEST", 
    "SearchKeys":["ZZZ","YYY","XXX"], 
    "HiddenDomains":["VAU","THG","MEK",""], 
    "HiddenCompanies":["MGM"] 
} 

回答

1

我已經玩過這個了。我相信正在發生的是Wep Api使用List<string>屬性的getter(獲取一個新的空列表),然後將字符串添加到列表中。一旦Web Api完成將字符串添加到列表中,該列表僅留下沒有引用並收集垃圾。 setter似乎沒有被調用。

如果你不想改變你的模型實際上有真正List<string>成員,那麼你可以從ToStringList方法返回null而不是new List<string>解決這個問題。然後,當Web API使用getter並獲取null時,它將在稍後調用setter。

不過,我想你會得到很好的建議給SearchKeys等存儲在類真正List<string>成員,然後,而不是有一個返回列表爲空格分隔的單詞的內容屬性:

[Column("ORD")] 
[Display(Name = "Søgeord")] 
public string SearchKeysString { get { return SearchKeys.Aggregate<string>((a, b) => a + " " + b); } } 
public List<string> SearchKeys { get; set; } 
+0

問題是db中的「SearchKeys」是一個空格分隔的字符串。最初,我對如何讓實體框架爲我做映射做了一點研究,顯然這是不可能的。由於我不允許重新調整數據庫將「SearchKeys」放在他們所屬的單獨表格中,我認爲即使這不是最佳做法,我也必須採用這種解決方案。更改null是個訣竅!謝謝! –

相關問題