1

私は MVC を初めて使用し、提案された MemberNames を返すためにテキストボックスでオートコンプリートを機能させようとしています。2 つの問題があります (問題 1 - ユーザーの最初のテキスト文字をコントローラーに取得する問題と、問題 2 - 返された名前のコントローラー リストをテキスト ボックスの下に表示する問題)。

意見:

@section scripts{ 
    <script type="text/javascript">
        $(document).ready(function () {
            $("#autocomplete").autocomplete({ source: '@Url.Action("MemberList", "Grievances", new { autocomplete = $("#autocomplete").val() })' });
    });     
    </script>
}
...
<input id="autocomplete">

問題 1 - 上記のビューで、@Url.Action の 3 番目のパラメーターを入力しないと、コントローラーがパラメーター値として null を受け取ります (多数の Web サイトで、オートコンプリートがこの値を自動的にバインドすると言っていますが、実行していません)。

次のように、3 番目のパラメーターにハードコードを入力すると、次のようになります。

new { autocomplete = "ead" }

次に、コントローラーはパラメーター値として「ead」を受け取ります。上記のコード ブロックにそのままコードを挿入すると、Web サイトでエラーが発生し、3 番目のパラメーターに「予期しない文字 '$'」というエラーが表示されます。

質問 1 - オートコンプリート テキスト ボックスの値をコントローラーに渡すにはどうすればよいですか?

問題2 - これが私のコントローラーコードです

public ActionResult MemberList(string autocomplete)
{
var memberNames = (from p in context.Members
                   where p.MemberName.Contains(autocomplete)
                   select p.MemberName).Distinct().Take(10);
string content = string.Join<string>("\n", memberNames);
return Content(content);
}

上記のビューの 3 番目のパラメーターに値 (「ead」など) をハード コードすると、コントローラーで値が取得されます。コントローラーはデータベースから適切なレコードのリストを取得し、それをビューに返します。ただし、テキスト ボックスの下には何も表示されません。ビューに必要な JavaScript ファイルと CSS ファイルが含まれています。値のリストをハードコーディングすると、テキスト ボックスの下に適切に表示されます。結果を取得できないのはコントローラーだけです。

質問 2 - オートコンプリート テキスト ボックスに値が表示されるように、コントローラが値のリストを返すようにするにはどうすればよいですか?

この 2 つの問題について、ご協力をお願いいたします。泥の中で車輪を回転させて、オートコンプリートを機能させているような気がします。

4

1 に答える 1

0

Q1への回答

次の行では、 jQuery ( $("#autocomplete").val()) と Razor ( @Url.Action("MemberList", ...) を混在させています。Razor はサーバー上で実行されますが、jQuery はクライアント上で実行されるため、エラーが発生します。

'@Url.Action("MemberList", "Grievances", new { autocomplete = $("#autocomplete").val() })'

URL に 3 番目のパラメーターは必要ありません。qおそらく、ユーザーがパラメーター名または 'term'に入力する必要があります。ドキュメントを参照してください

public ActionResult MemberList(string q)
{
 ...
}

Q2への回答

オートコンプリートに応答して HTML ビューを返すべきではありません。代わりに、値のリスト (配列) を JSON として返す必要があります。

public JsonResult MemberList(string autocomplete)
{
   var memberNames = (from p in context.Members
                   where p.MemberName.Contains(autocomplete)
                   select p.MemberName).Distinct().Take(10);
   //string content = string.Join<string>("\n", memberNames);
   return Json(memberNames.ToList(), JsonRequestBehavior.AllowGet);
}
于 2013-08-01T07:57:13.553 に答える