我正在构建一个JSON
字符串,以便将MVC
视图发送到jQuery UI autocomplete
。我手动执行,因为它允许我使用任何DataTable
,使用表中的任何列指定值和id列。
我构建了这样的字符串:
public static string CreateJsArray(DataTable dt, string idCol, string valCol)
{
var sb = new StringBuilder();
DataView sortedDv = dt.DefaultView;
sortedDv.Sort = valCol;
dt = sortedDv.ToTable();
sb.Append("[");
for (int i = 0; i < dt.Rows.Count; i++)
{
sb.AppendFormat(
i > 0
? ", {2} \"value\":\"{0}\", \"label\": \"{0}\", \"id\": \"{1}\" {3}"
: "{2} \"value\":\"{0}\", \"label\": \"{0}\", \"id\": \"{1}\" {3}",
dt.Rows[i][valCol].ToString().Trim().Replace("\"", "\\\""),
dt.Rows[i][idCol].ToString().Trim().Replace("\"", "\\\""),
"{",
"}");
}
sb.Append("]");
return string.Format("{0} \"items\": {1}{2}", "{", sb, "}");
}
我需要转义我希望用户在字段中拥有的所有字符,但实际上并不想为所有选项添加.Replace()
。有没有更快的方法呢?
虽然我没有使用所选的答案,但它确实让我走上了良好的道路。这是我采取的方法:
public static string CreateItemJSON(DataTable dt, string idCol, string valCol)
{
var serializer = new JavaScriptSerializer();
var jRow = Enumerable.Select(dt.AsEnumerable(), row => new ItemRows {
id = row.Field<string>(idCol),
label = row.Field<string>(valCol).TrimEnd()
}).ToList();
var jTable = new Item { items = jRow };
return serializer.Serialize(jTable);
}
public class ItemRows
{
public string label { get; set; }
public string id { get; set; }
}
public class Item
{
public List<ItemRows> items { get; set; }
}
答案 0 :(得分:3)
我建议您使用ViewModel或创建匿名类型并返回客户端:)
例如:
public JsonResult getAutoCompletedata(string query)
{
var query = from p in dt.AsEnumerable() //dt is the datatable
where p.Field<string>("code") == query
select new
{
value = p.Field<string>("yourColumnName"),
lable= p.Field<string>("YourAnotherColumnName")
}.ToList();
return Json(query, JsonRequestBehavior.AllowGet);
}