我正在研究MVC 5应用程序,并尝试允许用户编写自己的查询并在Jquery DataTables中显示结果。我很难确定如何根据用户输入动态构建匿名JSON对象。
理论上,用户将发送列列表和where子句以构建SQL查询。 我会像这样运行SQL查询,并构建我的对象。
如何动态构建这个"选择新的{DT_RowId = a.id,name = a.name,number = a.number}"取决于用户输入的内容。
var v = (from a in dc.Products.SqlQuery(querystring) select new { DT_RowId = a.id, name = a.name, number = a.number }).ToList();
最终JSON响应是
数据":[{" id":56," name":" Product 55"," number":& #34; 55"}]
硬编码时工作正常。否则,我将不得不从产品中选择*,然后在客户端显示/隐藏列,这样如果所有列都从服务器返回,我的数据有效载荷就会非常大。
有没有办法循环遍历请求的属性来构建这个匿名对象?我试图使用一个字典但是Json返回的是非常不同的,它有Key和Value,而这不是DataTables所期望的。
谢谢!
完整控制器代码
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);
}
解决方案感谢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 :(得分:0)
如果您正在使用JSON.NET,则字典应序列化,并将Key的值作为属性名称,并将与该键关联的值作为属性值进行序列化。
如果您正在使用DataContractJsonSerializer,则需要将设置UseSimpleDictionaryFormat
设置为true。
然后,您将使用属性的名称作为键来构建字典,并将值作为值。如果用户选择了他们想要的名称,您可以执行outputDict.Add(nameof(x.Name), x.Name);
之类的操作,然后返回要由序列化库序列化的字典。
答案 1 :(得分:0)
1 /要从名称中获取属性的值,可以使用属性描述符:
var properties = TypeDescriptor.GetProperties(typeof(Product));
var value = properties[name].GetValue(product);
2 /要构建答案,您可以创建一个dynamic
对象:
dynamic result = new ExpandoObject();
var dict = (IDictionary<string,object>)result;
dict[name] = value;
然后可以将result
转换为JSON。