2017-11-06 10 views
2

私はclsUtilitiesという名前のクラスとPhoneBook_SearchCustomersという名前のクラスを持っています。私はFNameとそれに対応するIdを取りたいです。私のDataTableIdFNameの両方を持っています。今度はDataTableをリストに変換します。 List<object> ids = (from row in ss.AsEnumerable() select row["FName"]).ToList();Idを同じ行に入力する方法がわからないので、これをJavaScriptに渡すことができます。私のASP.NET MVCプロジェクトでオートコンプリート機能を実装したい

マイclsUtilitiesクラス

public DataSet CreateCommandwithParams(string queryString, SqlParameter[] prms) 
     { 
      string mConnString = ConfigurationManager.ConnectionStrings["TestConnection"].ConnectionString; 
      using (SqlConnection conn = new SqlConnection(mConnString)) 
      { 
       SqlCommand cmd = new SqlCommand(queryString, conn); 
       cmd.CommandType = CommandType.Text; 
       if (prms != null) 
       { 
        foreach (SqlParameter p in prms) 
        { 
         cmd.Parameters.Add(p); 
        } 
       } 
       DataSet ds = new DataSet(); 
       SqlDataAdapter da = new SqlDataAdapter(); 
       da.SelectCommand = cmd; 
       conn.Open(); 
       da.Fill(ds); 
       return ds; 
      } 

     } 

マイホームコントローラー

[HttpPost] 
     public JsonResult AutoComplete(string prefix) 
     { 
      clsUtilities cUtils = new clsUtilities(); 
      DataSet ds; 
      SqlParameter[] prms = new SqlParameter[1]; 
      string sSQLName; 
      sSQLName = " PhoneBook_SearchCustomers @FName"; 
      prms[0] = new SqlParameter("@FName", SqlDbType.VarChar); 
      prms[0].Value = prefix; 
      ds = cUtils.CreateCommandwithParams(sSQLName, prms); 
      DataTable ss = ds.Tables[0]; 
      List<object> ids = (from row in ss.AsEnumerable() select row["FName"]).ToList(); 
      return Json(ids); 

     } 

私はJavaScript

$(function() { 
     $("#txtCustomer").autocomplete({ 
      source: function (request, response) { 
       // debugger; 
        $.ajax({ 
        url: '/Home/AutoComplete/', 
        data: "{ 'prefix': '" + request.term + "'}", 
        dataType: "json", 
        type: "POST", 
        data: JSON.stringify({ prefix: request.term, count: 20 }), 
        contentType: "application/json; charset=utf-8", 
        success: function (data) { 
         response($.map(data, function (item) { 
          debugger; 
          return item; 

         })) 
        }, 
        error: function (response) { 
         alert(response.responseText); 
        }, 
        failure: function (response) { 
         alert(response.responseText); 
        } 
       }); 
      }, 

      select: function (e, i) { 
       debugger; 
       $("#hfCustomer").val(i.item.val); 
      }, 
      minLength: 1 
     }); 
}); 

コントローラからval値を取得する方法を私を導いてください。 valは未定義を示しています。前もって感謝します。

答えて

2

dataTypeあなたすでに正確なので、送信する前にJSONデータを文字列化しないでください。

$("#name").autocomplete({ 
     source :function(request, response) { 
      $.ajax({ 
        url: "/Home/AutoComplete/", 
        dataType: "json", 
        data: { 
         prefix: request.term 
       }, 
       success: function(data) { 
        response($.map(data, function(item) { 
         return { 
          label : item.Value, 
          key: item.Key 
        }; 
       })); 
      } 
     }); 
    }, 
    select: function (event, ui) { 
     $("#hfCustomer").val(ui.item.label); 
     $("#hfCustomer").attr("id", ui.item.key); 
     return false; 
    } 
}); 

し、サーバー側であなたのような件のデータ(IDと値)を送信することができます:

[HttpPost] 
public JsonResult AutoComplete(string prefix) 
{ 
    clsUtilities cUtils = new clsUtilities(); 
    DataSet ds; 
    SqlParameter[] prms = new SqlParameter[1]; 
    string sSQLName; 
    sSQLName = " PhoneBook_SearchCustomers @FName"; 
    prms[0] = new SqlParameter("@FName", SqlDbType.VarChar); 
    prms[0].Value = prefix; 
    ds = cUtils.CreateCommandwithParams(sSQLName, prms); 
    DataTable ss = ds.Tables[0]; 
    List<KeyValuePair<string, string> results = ss.Select(p=>new KeyValuePair<int, string>(int.Parse(p["FId"]), p["FName"]).ToList(); 
    return Json(results); 
} 
+0

をPOSTメソッドは一つのパラメータのみ '公共化するJsonResultオートコンプリート(文字列のプレフィックスを)受け入れる'いずれかの方法で、これはないだろう他に変更する必要があります – Niladri

+0

@GGO、あなたの答えをありがとう。しかし、私はIDからFNameを得た方法のようにIdをコントローラから取得しなければならない。私はそれを得る方法を知らない。私に提案してください。 – Raj

+0

@ニラドリ、私は唯一の問題はデータベースからIDを取得することだと思います。このコードは私にFNameを与え、FNameを返します。しかし、私は戻り値JName(ids)でFNameとIdを返したい。 – Raj

1

私が変更しましたJsonResultこれのようなオートコンプリート関数は今私のために働いていました。

[HttpPost] 
     public JsonResult AutoComplete(string prefix) 
     { 
      clsUtilities cUtils = new clsUtilities(); 
      DataSet ds; 
      SqlParameter[] prms = new SqlParameter[1]; 
      string sSQLName; 
      sSQLName = " PhoneBook_SearchCustomers @FName"; 
      prms[0] = new SqlParameter("@FName", SqlDbType.VarChar); 
      prms[0].Value = prefix; 
      ds = cUtils.CreateCommandwithParams(sSQLName, prms); 
      DataTable ss = ds.Tables[0]; 
      List<Test> phoneBookList = new List<Test>(); 
      phoneBookList = (from DataRow dr in ss.Rows 
          select new Test() 
          { 
           FName = dr["FName"].ToString(), 
           Id = Convert.ToInt32(dr["Id"]) 

          }).ToList(); 
      return Json(phoneBookList); 
     } 

とJavaScriptで、成功へのいくつかの変更と選択します。

$(function() { 
     $("#txtCustomer").autocomplete({ 
      source: function (request, response) { 
        $.ajax({ 
         url: '/Home/AutoComplete/', 
         data: "{ 'prefix': '" + request.term + "'}", 
         dataType: "json", 
         type: "POST", 
        contentType: "application/json; charset=utf-8", 
        success: function (data) { 
         response($.map(data, function (item) { 
          //debugger; 
          return { 
           value: item.FName, 
           id: item.Id 
          }; 
        })) 
        }, 
        error: function (response) { 
         alert(response.responseText); 
        }, 
        failure: function (response) { 
         alert(response.responseText); 
        } 
       }); 
      }, 
      select: function (event, ui) { 
       //debugger; 
       $("#hfCustomer").val(ui.item.value); 
       $("#hfCustomer").val(ui.item.id); 
      }, 
      minLength: 1 
     }); 
}); 
+0

一時的な 'Test'クラスを使わなければならないのは普通ではありません。私の例はうまくいくはずです。それ以外の場合は、KeyValuePairを使用できます。私はこれで私の答えを更新しますが、それがあなたに合っていない場合は、別のほぼ重複する回答を加える代わりに私の答えを編集することが望ましいです。訪問者の方がより明確です。 – GGO

+0

@GGO、ありがとうございます。私はオートコンプリート機能にいくつかの変更を加え、それは私のために働いた。だから私は、他の人が同じような状況に陥った場合、その恩恵を受けることができるように、ここに置く方が良いと思った。 – Raj

+0

なぜ私の答えは未解決ですか? KeyValuePairは良い方法です、あなたのソリューションは私の複製です... – GGO

関連する問題