【问题标题】:How to post complex object including lists to ASP Web Api 2如何将包括列表在内的复杂对象发布到 ASP Web Api 2
【发布时间】:2017-06-19 09:44:39
【问题描述】:

我正在尝试通过 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】:

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

    如果您不想将模型更改为实际拥有真正的List&lt;string&gt; 成员,那么您可以通过从ToStringList 方法返回null 而不是new List&lt;string&gt; 来解决此问题。然后,当Web API 使用 getter 并获得 null 时,它会在稍后调用 setter。

    不过,我认为最好将SearchKeys 等存储在类中的真实List&lt;string&gt; 成员中,然后使用一个属性将列表的内容作为空格分隔的单词返回:

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

    【讨论】:

    • 问题是 db 中的“SearchKeys”是一个空格分隔的字符串。最初,我对如何使实体框架为我进行映射进行了一些研究,显然这是不可能的。而且由于我不允许重组数据库,将“SearchKeys”放在它们所属的单独表中,我认为我将不得不采用这个解决方案,即使它不是最佳实践。改变 null 就成功了!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多