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;
}
Welchen JSON Serializer verwenden Sie? –
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