2017-02-02 14 views
2

jquery ajax呼び出しを使用して、複数のリスト/文字列配列を含む複雑なオブジェクトを投稿しようとしています。オブジェクトのスカラプロパティだけが、配列ではなくマッピングされているように見えます。リストを含む複雑なオブジェクトをASP Webアプリケーションに投稿する方法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呼び出し:

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

私はこれを少しやりました。私は起こっていると考えているのは、Wep ApiList<string>プロパティのgetter(新しい空のリストを取得する)を使用してから、リストに文字列を追加することです。 Web Apiが文字列をリストに追加すると、リストは参照なしで残され、ガベージコレクションが行われます。 setterは呼ばれていないようです。

あなたが実際に本物のList<string>メンバーを持っているあなたのモデルを変更したくない場合は、ToStringList方法からnull代わりのnew List<string>を返すことによってこの問題を回避することができます。次に、Web APIがgetterを使用し、nullを取得すると、後でセッターを呼び出します。

それでも、私はあなたがよくクラスで実際のList<string>メンバーに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; } 
+0

問題は、db内の "SearchKeys"がスペースで区切られた文字列であることです。最初は、エンティティ・フレームワークを私のためにマッピングする方法を少し研究しましたが、明らかに不可能です。私はdbを "SearchKeys"を別のテーブルに入れて再構成することは許されていないので、ベストプラクティスではないにしても、私はこの解決策をとらなければならないと思う。 nullを変更すると、そのトリックがやりました!ありがとうございました! –

関連する問題