2017-02-02 1 views
2

Post Ich versuche, ein komplexes Objekt, das mehrere Liste/Arrays von Zeichenfolgen, über eine Jquery Ajax-Aufruf enthalten. Es werden nur die Skalareigenschaften des Objekts abgebildet, nicht die Arrays.Wie komplexe Objekte einschließlich Listen zu ASP Web Api 2

Ich habe einige Suchen durchgeführt, kann aber keine Beispiele oder Lösungen für dieses genaue Szenario finden.

web api Methode:

[HttpPost] 
public IHttpActionResult Save(MenuSearchGuideEntry model) 
{ 
    //Do stuff 
    return Ok(""); 
} 

MenuSearchGuideEntry Objekt:

[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-Aufruf:

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

     } 
    }); 
} 

Objekt via Ajax posted:

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

Antwort

1

Ich habe damit ein bisschen herumgespielt. Ich glaube, was passiert, ist, dass Wep Api die getter der List<string> Eigenschaften verwendet (eine neue leere Liste bekommen) und dann Zeichenfolgen zur Liste hinzufügt. Sobald Web Api fertig ist, fügen Sie die Strings zur Liste hinzu, die Liste wird nur ohne Referenzen verlassen und sammelt Müll gesammelt. Die setter scheint nicht aufgerufen zu werden.

Wenn Sie wollen echte List<string> Mitglieder nicht ihr Modell ändern, um tatsächlich haben, dann können Sie dies umgehen, indem null statt new List<string> aus dem ToStringList Methode zurück. Wenn dann Web API den Getter verwendet und null erhält, wird der Setter später aufgerufen.

Trotzdem denke ich, Sie würden auch die SearchKeys usw. in Echt List<string> Mitglieder in der Klasse zu speichern empfohlen werden, und dann haben stattdessen eine Eigenschaft, die den Inhalt der Liste als Leerzeichen getrennte Wörter zurück:

[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

Problem ist, dass "SearchKeys" in db eine durch Leerzeichen getrennte Zeichenfolge ist. Anfangs habe ich ein wenig recherchiert, wie man Entity Framework das Mapping für mich machen lässt, anscheinend ist das nicht möglich. Und da es mir nicht erlaubt ist, das db neu zu strukturieren, indem ich "SearchKeys" in eine separate Tabelle lege, wo sie hingehören, denke ich, dass ich mit dieser Lösung gehen muss, auch wenn es keine Best Practice ist. Ändern der Null hat den Trick! Vielen Dank! –