2016-09-26 5 views
0

Ich arbeite an einer MVC 5-Anwendung und versuche, dem Benutzer zu ermöglichen, ihre eigene Abfrage zu schreiben und die Ergebnisse in Jquery DataTables anzuzeigen. Es fällt mir schwer herauszufinden, wie man ein anonymes JSON-Objekt abhängig von den Benutzereingaben dynamisch erstellt.MVC 5 Erstellen eines dynamischen anonymen Objekts

Theoretisch würde der Benutzer eine Liste von Spalten und eine WHERE-Klausel senden, um eine SQL-Abfrage zu erstellen. Ich würde die SQL-Abfrage wie folgt ausführen und mein Objekt erstellen.

Wie kann ich das dynamisch erstellen? Wählen Sie "{DT_RowId = a.id, name = a.name, number = a.number}", je nachdem, was der Benutzer eingibt.

var v = (from a in dc.Products.SqlQuery(querystring) select new { DT_RowId = a.id, name = a.name, number = a.number }).ToList(); 

Letztendlich ist die JSON reponse ist

Daten ": [{" id ": 56," name ":" Artikel 55" , "Nummer": "55"}]

Es funktioniert gut, wenn hart codiert.Andernfalls muss ich wählen * aus Produkten und dann Spalten auf der Client-Seite anzeigen/ausblenden, so dass meine Data Payload sehr groß, wenn alle Spalten vom Server kommen

gibt es einen Weg Um die angeforderten Eigenschaften zu durchlaufen, um dieses anonyme Objekt zu erstellen, habe ich versucht, ein Dictionary, aber die Js zu verwenden on return war sehr unterschiedlich, es hatte Schlüssel und Wert drin, und das ist nicht was DataTables erwartet.

Danke!

FULL Steuerungskode

using (DataTableExampleContext dc = new DataTableExampleContext()) 
     { 
      var v = (from a in dc.Products.SqlQuery(querystring) select new { DT_RowId = a.id, name = a.name, number = a.number }).ToList(); 

      recordsTotal = v.Count(); 
      var data = v.Skip(skip).Take(pageSize).ToList(); 


      return Json(new { draw = draw, recordsFiltered = recordsTotal, recordsTotal = recordsTotal, data = data }, JsonRequestBehavior.AllowGet); 
     } 

Lösung Dank Phillipe

 using (DataTableExampleContext dc = new DataTableExampleContext()) 
     { 
      var v = (from a in dc.Products.SqlQuery(querystring) select GetResult(a, ColumnNames)).ToList(); 

      recordsTotal = v.Count(); 
      var data = v.Skip(skip).Take(pageSize).ToList(); 

      return Json(new { draw = draw, recordsFiltered = recordsTotal, recordsTotal = recordsTotal, data = data }, JsonRequestBehavior.AllowGet); 
     } 
    } 

    public Dictionary<string,object> GetResult(Product p, List<string> columnNames) 
    { 
     var properties = TypeDescriptor.GetProperties(typeof(Product)); 
     var dict = new Dictionary<string, object>(); 

     foreach (var x in columnNames) 
     { 
      if (x == "id") 
      { 
       dict["DT_RowId"] = properties[x].GetValue(p); 
      } 
      else 
      { 
       dict[x] = properties[x].GetValue(p); 
      } 

     } 
     return dict; 
    } 
+0

Welchen JSON Serializer verwenden Sie? –

+0

Siehe meinen vollen Controller-Code oben in Bearbeitung. Ich gebe den JSON vom Controller an JQuery DataTables zurück. Was jedoch als Daten zurückgegeben wird, ist das, was ich in meiner Abfrageanweisung auswähle. Das möchte ich dynamisch definieren, damit ich nicht alle Spalten in den DBS-Produkten zurückgeben muss. – ian486

Antwort

0

1/die Werte der Eigenschaften von ihrem Namen zu erhalten, Sie Eigenschaftendeskriptoren verwenden:

var properties = TypeDescriptor.GetProperties(typeof(Product)); 
var value = properties[name].GetValue(product); 

2/So bauen die Antwort, können Sie ein dynamic-Objekt erstellen:

dynamic result = new ExpandoObject(); 
var dict = (IDictionary<string,object>)result; 
dict[name] = value; 

Die result kann dann in JSON konvertiert werden.

+0

Wie kann ich den Wert auf "a.name" oder "a.number" in meinem Beispiel von oben festlegen? – ian486

+0

Ich möchte diese Zeile neu erstellen "wählen Sie neue {DT_RowId = a.id, name = a.name, Nummer = a.number}" – ian486

+0

'dict [" DT_RowId "] = Eigenschaften [" id "]. GetValue (a); 'und so weiter, nachdem" Eigenschaften "und" Diktat "erstellt wurden. 'result' hat dann dieselben Eigenschaften wie Ihr Beispiel (aber in einem dynamischen Objekt anstelle eines statischen). – Philippe

0

Wenn Sie mit JSON.NET, ein Wörterbuch sollte mit dem Wert des Schlüssels als Name der Eigenschaft serialisiert werden und die Wert, der dem Schlüssel als Eigenschaftswert zugeordnet ist. Wenn Sie den DataContractJsonSerializer verwenden, müssen Sie die Einstellung UseSimpleDictionaryFormat als wahr angeben.

Sie würden dann Ihr Wörterbuch mit dem Namen der Eigenschaft als Schlüssel und dem Wert als Wert erstellen. Wenn der Benutzer wählt, dass er den Namen möchte, würden Sie etwas wie outputDict.Add(nameof(x.Name), x.Name); tun und dann das Wörterbuch zurückgeben, das von Ihrer Serialisierungsbibliothek serialisiert werden soll.

+0

Kannst du erklären, wie ich dieses neue {DT_RowId = a.id, name = a.name, number = a.number} mithilfe deines Ansatzes neu erstellen kann?Außerdem verwende ich JSONResult – ian486

Verwandte Themen