2017-05-23 14 views
0

JQueryのオートコンプリートでパラメータを渡すのに助けが必要です。私は入力があります:jqueryオートコンプリート渡しパラメータ

<input type="text" class="form-control mb-2 mr-sm-2 mb-sm-0" name="searchName" id="searchName" placeholder="Nom et/ou prénom" /> 

フォームの中にあります。あなたが入力すると、jqueryのオートコンプリート機能は、Active Directory内の検索を起動し、ショーは、ドロップダウンリストの結果:

$(document).ready(function() { 
     $("#searchName").autocomplete({ 
      source: function (request, response) { 
       $.ajax({ 
        url: "/Home/SearchUserWhileTyping", 
        type: "GET", 
        data: { name: $("#searchName").val() }, 
        contentType: "application/json;charset=utf-8", 
        dataType: "json", 
        success: function (data) { 
         $("#searchName").html(''), 
         response($.map(data, function (item) { 
          return { 
           label: item 
          } 
         })); 
        } 
       }); 
      }, 
      minLength: 4 
     }) 
    }); 
    $(document).ready(function(){ 
     $('#searchName').on('autocompletechange change', function() { 
       $('#searchValue').html('You selected: ' + this.value); 
      }).change()}); 

今の私は、唯一のフォーム検証の後にそれを行うことができます。フォームが検証される - >私はロードユーザーが見つけた一意のID - > 1つのリンクをクリックすると、渡された一意のIDのおかげでユーザー情報が表示されます。私がしたいことは、オートコンプリートの選択肢の1つをクリックすると、ユーザーの情報が直接表示されます。ここで

あなたが入力中に検索のためのコードです:

[HttpGet] 
    public ActionResult SearchUserWhileTyping(string name) 
    { 
     ADManager adManager = new ADManager(); 
     List<string> lastName = adManager.SearchUserByName(name); 
     List<string> splitList = new List<string>(); 
     if (lastName != null) 
     { 
      if (lastName.Count <= 10) 
      { 
       int inc = 0; 
       foreach(string splitter in lastName) 
       { 
        if (inc % 2 == 1) 
        { 
         splitList.Add(splitter); 
        } 
        inc++; 
       } 
       return Json(splitList, JsonRequestBehavior.AllowGet); 
      } 
     } 
     return null; 
    } 

他の機能は私がADを検索することができますし、すぐにして、ユーザーを見つけることが有用であろういくつかのパラメータを(返すので、私は、スプリッタを使用そのユニークなID、それは私の難しさです)。私は、ユーザーの私のリストを持っているとき、私は彼らのリンクをクリックすることができ、最後に

public List<string> SearchUserByName(string name) 
     { 
      try 
      { 
       DirectoryEntry ldapConnection = createDirectoryEntry(); 
       DirectorySearcher search = new DirectorySearcher(ldapConnection); 
       var sidInBytes=new byte[0]; 
       //anr permet de chercher tout utilisateur contenant "name" 
       search.Filter = "(&(objectClass=user)(anr=" + name + "))"; 
       //search.Filter = "(&(objectClass=User) (name=" + name + "*))"; 
       search.PropertiesToLoad.Add("displayName"); 
       search.PropertiesToLoad.Add("distinguishedName"); 
       resultCollection = search.FindAll(); 

       if (resultCollection.Count == 0) 
       { 
        return null; 
       } 
       else 
       { 
        foreach(SearchResult sResult in resultCollection) 
        { 
         if (sResult.Properties["distinguishedName"][0].Equals(null) || 
          sResult.Properties["displayName"][0].Equals(null)) 
          continue; 

         displayName.Add(sResult.Properties["distinguishedName"][0].ToString()); 
         displayName.Add(sResult.Properties["displayName"][0].ToString()); 
        } 
       } 
       ldapConnection.Close(); 
       ldapConnection.Dispose(); 
       search.Dispose(); 
       return displayName; 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine("Exception caught:\n\n" + e.ToString()); 
      } 
      return null; 
     } 

と私は、この機能を使用してユーザーに関する情報ロード: これは、次の関数を呼び出す

public List<KeyValuePair<string,string>> GetUserInfoBySAMAN(string sAMAccountName) 
     { 
      try 
      { 
       DirectoryEntry ldapConnection = createDirectoryEntry(); 
       DirectorySearcher search = new DirectorySearcher(ldapConnection); 


       search.Filter = "(sAMAccountName=" + sAMAccountName + ")"; 
       search.PropertiesToLoad.Add("objectSID"); 
       search.PropertiesToLoad.Add("displayName"); 
       search.PropertiesToLoad.Add("memberOf"); 
       search.PropertiesToLoad.Add("description"); 
       search.PropertiesToLoad.Add("accountExpires"); 
       search.PropertiesToLoad.Add("sAMAccountName"); 
       result = search.FindOne(); 

       ///Conversion du SID en chaine de caractères 
       var sidInBytes = (byte[])result.Properties["objectSID"][0]; 
       var sid = new SecurityIdentifier(sidInBytes, 0); 

       String time; 
       if (result.Properties["accountExpires"][0].ToString().Equals("0")|| result.Properties["accountExpires"][0].ToString().Equals("9223372036854775807")) 
       { 
        time = "Jamais"; 
       } 
       else 
       { 
        ///Conversion de la date en entier puis en date 
        DateTime dt = new DateTime(1601, 01, 02).AddTicks((Int64)result.Properties["accountExpires"][0]); 
        time = dt.ToString(); 
       } 

       string desc=""; 
       if (result.Properties.Contains("description")) 
       { 
        desc = result.Properties["description"][0].ToString(); 
       } 
       else 
       { 
        desc = "Pas de description disponible"; 
       } 
       userInfo = new List<KeyValuePair<string, string>>() 
       { 
        new KeyValuePair<string, string>("displayName",result.Properties["displayName"][0].ToString()), 
        new KeyValuePair<string, string>("memberOf", result.Properties["memberOf"][0].ToString()), 
        new KeyValuePair<string, string>("accountExpires",time), 
        new KeyValuePair<string, string>("description",desc), 
        new KeyValuePair<string, string>("sid",sid.ToString()), 
        new KeyValuePair<string, string>("sAMAccountName",result.Properties["sAMAccountName"][0].ToString()) 
        /*lastName.Add(result.Properties["displayName"][0].ToString()); 
        lastName.Add(result.Properties["memberOf"][0].ToString()); 
        lastName.Add(sid.ToString()); 
        lastName.Add(result.Properties["accountExpires"][0].ToString()); 
        lastName.Add(result.Properties["description"][0].ToString());*/ 
       }; 

       return userInfo; 
      } 
      catch(Exception e) 
      { 
       Console.WriteLine("Exception caught:\n\n" + e.ToString()); 
      } 
      return null; 
     } 

最後にそれを明らかにこの属性を使用できないので、sAMAccountNameをdistinguishedNameで変更すると、関数が機能しません。私はdistinguishedNameを使用し、すぐに私のオブジェクトを持っています。

私が必要とするのは、入力中に検索することです。提案された選択肢の1つを選択すると、すぐにフォームの検証が行われ、ユーザー情報ページに送られます。あなたの助けのための

おかげで、私が選択した項目の値を取得することができます第二スクリプトを追加、編集十分

明らかであると思いますが、私は、私の場合、コントローラ

+0

選択したプラグインを使用すると、変更時に値が選択され、表示する内容が表示されます。 – Munzer

+0

私は自分の質問を編集しました。あなたが提案したように、値を選択できるスクリプトを追加しました。問題はSearchUserWhileTypingメソッドにあり、名前のリストのみを取得し、distinguishedName属性を追加するとリストに表示されます(これは不要です)。 –

答えて

0

を通過したデータを必要としますわかりました、autocompleteメソッドはselectイベントを持っています。

$(document).ready(function() { 
    $("#searchName").autocomplete({ 
     source: function (request, response) { 
      $.ajax({ 
       url: "/Home/SearchUserWhileTyping", 
       type: "GET", 
       data: { name: $("#searchName").val() }, 
       contentType: "application/json;charset=utf-8", 
       dataType: "json", 
       success: function (data) { 
        $("#searchName").html(''), 
        response($.map(data, function (item) { 
         return { 
          label: item 
         } 
        })); 
       }, 

       select: function(e, ui) 
       { 
       //Just Example 
       $.get("UserController", {ID: ui.Id}).done(
        function(data){ 
        }); 
       //Write your ajax post or get method 
       //that fetches user data directly as soon as 
       //the item in list clicked 
       } 
      }); 
     }, 
     minLength: 4 
    }) 
}); 

編集:あなたは(私は「UserControllerで」を書いた場所の代わりに)selectイベント内のAjaxのGETリクエストのためにあなたのGetUserInfoBySAMAN機能を使用できるように、私は、あなたの編集を見て、あなたが入力に戻りデータを結合するための仕事を持っていますまたはラベルも同様に使用できます。

+0

ありがとう、私はこれを試してみます。もう一つは、名前だけでリストのsplitListを渡すことです。それ以外の場合は、ドロップダウンリストにIDを表示します。どのようにajaxでこれを処理するための任意のアイデアですか?言ってやるがいい.Ajaxでは2つのうち1つを選ぶことにした。 –

+0

これはうまくいくと思います。あなたがIDを書くとき、それは私のdistinguishedNameのものですか? –

+0

IDは単なる例であり、ユーザーをフィルタリングしてユーザーデータを取得するために 'AccountName'を使用することがわかりました。Btw、私があなただったら、バックエンドとクライアントの間でデータを渡すためのDTOオブジェクトクラスを作成します。 "UserInfo" [ここ](http://www.encodedna.com/webapi/aspdotnet-webapi-example-autocomplete-text-using-jquery.htm)の意味を確認できます – ibubi

関連する問題