Jquery 如何将包含列表的复杂对象发布到ASP Web Api 2

Jquery 如何将包含列表的复杂对象发布到ASP Web Api 2,jquery,asp.net,ajax,asp.net-web-api,Jquery,Asp.net,Ajax,Asp.net Web Api,我试图通过jqueryajax调用发布一个包含多个字符串列表/数组的复杂对象。似乎只有对象的标量属性被映射,而不是数组 我做了一些搜索,但找不到任何例子或解决方案,这个确切的情况 web api方法: [HttpPost] public IHttpActionResult Save(MenuSearchGuideEntry model) { //Do stuff return Ok(""); } MenuSearchGuideEntry对象: [Table("MENUSOEGN

我试图通过jqueryajax调用发布一个包含多个字符串列表/数组的复杂对象。似乎只有对象的标量属性被映射,而不是数组

我做了一些搜索,但找不到任何例子或解决方案,这个确切的情况

web 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();
    }
}
通过Ajax发布的对象:

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

我已经试过了。我相信现在发生的是
wepapi
使用
List
属性的
getter
(获取一个新的空列表),然后向列表中添加字符串。一旦
webapi
完成将字符串添加到列表中,列表就没有引用,并被垃圾收集。
setter
似乎没有被调用

如果您不想将模型更改为实际拥有真正的
列表
成员,那么您可以通过从
ToStringList
方法返回
null
而不是
新列表
来解决此问题。然后,当
webapi
使用getter并获取null时,它将稍后调用setter

尽管如此,我还是建议您将
搜索键
等存储在类中的real
List
成员中,然后使用一个属性以空格分隔的单词形式返回列表内容:

[Column("ORD")]
[Display(Name = "Søgeord")]
public string SearchKeysString { get { return SearchKeys.Aggregate<string>((a, b) => a + " " + b); } }
public List<string> SearchKeys { get; set; }
[列(“ORD”)]
[显示(Name=“Søgeord”)]
公共字符串SearchKeysString{get{return SearchKeys.Aggregate((a,b)=>a+“”+b);}
公共列表搜索键{get;set;}
问题在于db中的“SearchKeys”是一个空格分隔的字符串。最初我做了一些研究,研究如何让实体框架为我做映射,显然这是不可能的。由于不允许我重组数据库,将“搜索键”放在它们所属的单独表格中,因此我认为我将不得不采用这种解决方案,即使这不是最佳实践。更改空值成功了!非常感谢。
[Column("ORD")]
[Display(Name = "Søgeord")]
public string SearchKeysString { get { return SearchKeys.Aggregate<string>((a, b) => a + " " + b); } }
public List<string> SearchKeys { get; set; }