【问题标题】:Quickly escape special characters while building a string在构建字符串时快速转义特殊字符
【发布时间】:2013-11-07 03:14:45
【问题描述】:

我正在构建一个JSON 字符串以发送到我的MVC 视图以获取jQuery UI autocomplete。我手动执行此操作,因为它允许我获取任何 DataTable,使用表中的任何列指定 value 和 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; }
}

【问题讨论】:

    标签: c# regex json asp.net-mvc-3


    【解决方案1】:

    我建议你使用 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);
    }
    

    【讨论】:

    • 我喜欢这种方法,但无法让它发挥作用(我还没有真正使用过 Linq)。我更新了问题以表明我正在传递 dt、idCol 和 valCol。另外,我不想过滤 dt 中的记录。有了这个,我将如何让你的代码工作?感谢您的帮助。
    猜你喜欢
    • 2013-10-11
    • 1970-01-01
    • 2011-05-11
    • 2011-05-07
    • 1970-01-01
    • 2015-12-06
    • 2017-12-01
    • 2022-01-19
    • 1970-01-01
    相关资源
    最近更新 更多