如何将包括列表在内的复杂对象发布到 ASP Web API 2

问题描述 投票:0回答:1

我正在尝试通过 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"]
}
jquery asp.net ajax asp.net-web-api
1个回答
1
投票

我已经玩过这个了。我相信正在发生的事情是

Wep Api
使用
getter
属性的
List<string>
(获取一个新的空列表),然后将字符串添加到列表中。一旦
Web Api
将字符串添加到列表中,列表就不再有引用,并被垃圾收集。
setter
似乎没有被调用。

如果您不想更改模型以实际拥有真正的

List<string>
成员,那么您可以通过从
null
方法返回
new List<string>
而不是
ToStringList
来解决此问题。然后,当
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; }
© www.soinside.com 2019 - 2024. All rights reserved.