私は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 の値を設定するいくつかの異なる方法を試しました。