2017-11-02 8 views
1

私はデータベースを使用して電話帳アプリケーションを作成しました。それで、オートコンプリート機能を作成する必要があります。私はストアドプロシージャを記述したデータベースを持っています。私はまた、オートコンプリート用のJavaScriptコードを書いています。ASP.NET MVC Entity Frameworkアプリケーションでストアドプロシージャを使用してオートコンプリート検索を作成したい

私の問題は、どのようにコントローラのストアドプロシージャを呼び出すかです。

私のストアドプロシージャ:

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

CREATE PROCEDURE [dbo].[PhoneBook_SearchCustomers] 
    @FName NVARCHAR(30) 
AS 
BEGIN 
    SELECT * 
    FROM UserDetails 
    WHERE FName LIKE '%' + @FName + '%' 
END 

.cshtmlコードは次のとおりです。

<script type="text/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) { 
           return item; 
          })) 
         }, 
         error: function (response) { 
          alert(response.responseText); 
         }, 
         failure: function (response) { 
          alert(response.responseText); 
         } 
        }); 
       }, 
       select: function (e, i) { 
        $("#hfCustomer").val(i.item.val); 
       }, 
       minLength: 1 
      }); 
     }); 
    </script> 
    @using (Html.BeginForm("Index", "Home", FormMethod.Post)) 
    { 
     <input type="text" id="txtCustomer" name="CustomerName" /> 

    } 

これは私が捕まってしまったコントローラです。オートコンプリート機能を機能させるためにストアドプロシージャを呼び出す方法はありません。

[HttpPost] 
public JsonResult AutoComplete(string prefix) 
{ 
    using (PhoneBookDatabaseEntities entities = new PhoneBookDatabaseEntities()) 
    { 
     var nam = entities.PhoneBook_SearchCustomers(prefix); 

     var customers = (from customer in nam 
         where customer.FName.StartsWith(prefix) 
         select new 
           { 
            label = customer.FName, 
           }).ToList(); 
     return Json(customers); 
    } 
} 

ご協力いただきまして誠にありがとうございます。前もって感謝します。

答えて

2

あなたはこれで問題が解決しない場合は、より詳細な情報を提供してくださいvar nam = entities.PhoneBook_SearchCustomers(prefix).ToList();

よう

声明var nam = entities.PhoneBook_SearchCustomers(prefix);の最後に.ToList()を追加する必要があります(もしあればエラー)。

+0

私はnam変数に値を取得していますが、customers変数に値はありません。私を案内してください。このコードには何か問題があります。 var customers =(お客様の名前は )customer.FName.StartsWith(接頭辞) 新しい { label = customer.FName、 }を選択してください。ToList(); – Raj

+0

これは、あなたのSPでContains()条件で 'FName'をフィルタリングする理由があるかもしれませんが、あなたのコードでは、StartsWith()条件で再び' FName'をフィルタリングしています。 'FName'が_Alex_で、' prefix = "lex" 'の値をDBに記録しているとします。あなたのSPは、 'FName'が_Alex_であるレコードをすべて返しますが、それらのレコードは' prefix = "lex" 'で始まらないため、' customers'変数に追加されません。 – Ammar

1

短い答え:あなたのコントローラから

、あなたはEntity Frameworkのを使用しているように見えるので、ちょうどストアドプロシージャのためにこれを呼び出す:

entities.SqlQuery<YourEntityType>("storedProcedureName",params);

長い答え:

をあなたのSPからデータのエンドユーザキーごとに、クエリデータベースに要求が返ってくると言うことができます。

まず、オートコンプリートボックスをどのように扱うかによって異なりますが、これは文字のユーザーキーごとにドロップダウンが表示されますか?

すべての文字キーが入力されている場合、クエリがSQL DBに返送され、パフォーマンス上の問題が発生する可能性があります。

もしそうでなければ、ユーザーがキーを押すたびに「検索」をクリックする必要があるボタンを設計しますか?

提案では、パラメータを含むリスト全体をフロントエンドに渡しています。 は、select2のようなサードパーティのJSライブラリを使用して処理しています。

良い例がここで見つけることができます:Select2 - The Ultimate jQuery Autocomplete

関連する問題