如何将复杂对象(包括列表)发布到ASP Web Api 2

时间:2017-02-02 10:49:45

标签: jquery asp.net ajax asp.net-web-api

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

我已经做了一些搜索,但找不到任何关于这个确切场景的示例或解决方案。

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();
    }
}

Jquery 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) {

        }
    });
}

通过Ajax发布的对象:

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

1 个答案:

答案 0 :(得分:1)

我已经玩过这个了。我相信正在发生的事情是Wep Api使用getter属性的List<string>(获取新的空列表),然后将字符串添加到列表中。完成Web Api后,将字符串添加到列表中,列表就会没有引用而被垃圾收集。 setter似乎没有被调用。

如果您不想将模型更改为真正拥有真正的List<string>成员,那么您可以通过从{{1}返回null而不是new List<string>来解决此问题} 方法。然后,当ToStringList使用getter并获取null时,它将在稍后调用setter。

尽管如此,我认为你最好将Web API等存储在类中的真实SearchKeys成员中,然后使用一个属性来返回列表中的内容作为空格分隔词:

List<string>