0

私はMVCにかなり慣れていません。データベースを検索して結果を返す検索ページを設定しようとしています。検索ボックスは、ビューの Html.BeginForm 内にあり、次のようになります。

   <% using (Html.BeginForm())
     { %>
      <%= Html.TextBox("searchBox", null, new { @id = "searchBox" })%>
       <div id="searchButtonsDiv">
        <input type="submit" value="Search" />
      </div>
  <% } %>

  //Results are returned in a ul and orgainized


   //Pagination below
   <% if (Model.HasPreviousPage)
      { %>
        <%= Html.RouteLink("Previous", "SearchResults", new { page = (Model.PageIndex - 1) })%>
   <% } %>
   <% if (Model.HasNextPage)
      {  %>
         <%= Html.RouteLink("Next", "SearchResults", new { formCollection = "", page = (Model.PageIndex + 1) })%>
   <% } %>

FormCollection を使用して、次のようなコントローラーに渡します。

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Index(FormCollection formCollection, int? page)
    {
        var searchString = formCollection["searchBox"]; 
        var results = resultsRepository.GetResults();

        var paginatedResults = new PaginatedList<Driver>(results, page ?? 0, pageSize);

        return View(paginatedResults);
    }

ここまでは順調ですね。単語を入力して送信ボタンを押すと、Index が呼び出され、それに応じてデータベースが返されます。ul に結果が入力され、pageSize を超える結果 (私の場合は 10) がある場合、[次へ] リンクが表示されます。

「次へ」をクリックすると、デフォルトのページが読み込まれます。ページネーションなどはありません。私の Index ActionResult が FormCollection をパラメーターとして持っているという事実に関係していると確信しています。文字列/整数のみを処理できることをどこかで読んだと思いましたか? MapRoute は次のとおりです。

        routes.MapRoute(
            "SearchResults",
            "Drivers/Index/{formCollection}/{page}",
            new { controller = "Drivers", action = "Index", formCollection = "", page = "" }
        );

私は何かを完全に見逃していますか、それともこれを処理する方法はありますか? jquery/ajaxを使用して検索リストボックスに含まれる文字列を送信できることはわかっていますが、後で検索をフィルタリングする手段としてチェックボックスを追加する予定があるため、そうしたくありません.

検索ボックスを追加する新しい FormCollection を作成したり、文字列を渡すだけなど、formCollection の値を設定するいくつかの異なる方法を試しました。

4

1 に答える 1

1

アクションのFormCollection引数は問題ではありません。それは常にうまくいきます。

しかし、それは絶対にあなたのルートに属していません! それを取り除くだけで、おそらく問題は解決します。フォーム要素は URI に入らず、URI 内のものだけがルートにある必要があります。

ただし、そのアクション署名を書く方法ではありません。私はお勧めします:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Index(string searchBox, int? page)
{
    var results = resultsRepository.GetResults();

    var paginatedResults = new PaginatedList<Driver>(results, page ?? 0, pageSize);

    return View(paginatedResults);
}

View最後に: この場合、 aから aを返すべきではありませんPOST。これにより、ユーザーに奇妙な動作が発生します。たとえば、更新を押すと、ブラウザーはフォームの再送信について警告します。

次のいずれかを行う必要があります。

  1. 検索結果GETには ではなくを使用してください。POST
  2. ビューを返す代わりにリダイレクトします。

個人的には前者を選びます。

于 2010-02-25T14:28:01.257 に答える