2016-04-19 12 views
0

Ich habe in den letzten paar beschäftigt Tage daran zu arbeiten versucht, dies herauszufinden, aber ich habe nicht eine definitive Antwort als, wie man damit umgehen gefunden.ASP-Formular Array Datenbindung

Ich habe ein Modell, das wie folgt aussieht:

class Activity 
    int Id 
    string Name 
    DateTime Date 
    int DurationMinutes 
    string Comment 

    ICollection<Tags> Tags 
    ICollection<Sources> Sources 

Die regelmäßigen Eigenschaften binden, wie sie sollten. Ich möchte auch, dass Benutzer der Aktivität Tags und Quellen hinzufügen können.

Hier ist die Formstruktur:

form visual

und hier ist, wie ich es zur Zeit sparen: result

Auf diese Weise werden die Daten als normale Strings gesendet. Ich habe mich gefragt, was wäre eine gute Möglichkeit, dies zu implementieren.

Ich dachte über einen benutzerdefinierten Modelbinder zu schaffen eine richtige Aktivität zurückzukehren, wie die alle Quellen müssen erst geschaffen werden. Was wäre eine geeignete Methode, um die Daten im Frontend zu speichern? Oder ist dieser Ansatz völlig falsch?

Jeder Rat würde sehr geschätzt werden!

Antwort

0

Es ist schon eine Weile her, dass ich diese Frage gestellt habe, aber jetzt habe ich das Formular vollständig ausgefüllt ich hier meine Lösung wird Post.

Das Teil-Front-End schon in der Frage bedeckt war selbst und die JSON, die die mit der Anfrage senden erhalten wie folgt aussieht:

{"Type":"Book","Details":{"Name":"Book1","Chapter":"1","StartPage":"5","EndPage":"23"}},{"Type":"WebPage","Details":{"Name":"Page1","Url":"sometesturl.com","PageTypeIDs":"1"}} 

Diese Daten werden auf die ICollection < Quelle gebunden sein>, wie in die Frage.

Ich habe einige Probleme mit der JSON nicht im gültigen Format sein mußte, da die Zeichenfolge mehr JSON-Objekte halten, sind aber in einem Array nicht [].

In C# ich einen benutzerdefinierten Modelbinder geschaffen habe wie so all Daten zu binden:

public class ActivityTimerModelBinder : IModelBinder { } 

ich die Formulardaten erhalten:

string sourcesJSON = request.Form.Get("Sources"); 

dann die Methode selbst:

private List<Source> CreateSourcesFromJSON(string inputJSON) 
    { 
     List<Source> sources = new List<Source>(); 

     string validjson = "[" + inputJSON + "]"; 

     dynamic[] items = jsSerializer.Deserialize<dynamic>(validjson); 

     foreach (var item in items) 
     { 
      string type = item["Type"]; 

      string serialized = jsSerializer.Serialize(item["Details"]); 

      switch (type) 
      { 
       case "Book": 
        Book b = jsSerializer.Deserialize<Book>(serialized); 
        sources.Add(b); 
        break; 
       case "WebPage": 
        WebPage p = jsSerializer.Deserialize<WebPage>(serialized); 
        sources.Add(p); 
        break; 
       default: 
        break; 
      } 

     } 

     return sources; 
    } 

Dennoch, wenn es irgendwelche Vorschläge zur Verbesserung dieses Deserialisierungsprozesses der JSON gibt, würde ich geehrt werden.

Anmerkung: Ich habe eine dynamicForm jQuery Funktion hergestellt, die (gegebenenfalls) die Form auf basierend JSON erzeugt und gibt das Ergebnis als JSON auf ein HTML-Element. Es ist auf GitHub hier:

github.com/noelheesen/jQuery.dynamicForm