0

のビューJSONに送信する文字列を作成しています。テーブル内の任意の列を使用して任意の値を指定し、値と id 列を指定できるため、手動で行います。MVCjQuery UI autocompleteDataTable

次のように文字列を作成します。

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()ユーザーがフィールドに持つと予想されるすべての文字をエスケープする必要がありますが、すべてのオプションに a を追加したくありません。それを行うより速い方法はありますか?

答え

選択した回答は使用しませんでしたが、うまく機能する道をたどりました。これは私が取ったアプローチです:

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; }
}
4

1 に答える 1

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);
}
于 2013-11-07T03:20:05.490 に答える