0

私はそのような行動方法を持っています:

[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Search(String filter, String value, Int32? page) {
    var set = new List<Employee>();
    switch(filter) {
    case "by-name": {
            set = this.repository.Get(
                e => (e.LastName + " " + e.FirstName + " " + e.MiddleName) == value
            ).ToList();
            break;
        }
        case "by-empn": {
            set = this.repository.Get(
                e => e.EmployeeNumber == value
            ).ToList();
            break;
        }
        default: return RedirectToAction("Search", "Employee"); 
    }

    ViewBag.SearchedEmployees = set.Count();
    return View(set.ToPagedList(page ?? 1, PageSize));
}

検索ビューは次のようになります。

@if(Model.Count > 0) {
    foreach(var item in Model) {
        Html.RenderPartial("Employee.Card", item);
    }

    @Html.PagedListPager(
        Model,
        page => Url.Action("Search", new { page = page }),
        new PagedListRenderOptions {
            LinkToFirstPageFormat = "<< Beginning",
            LinkToPreviousPageFormat = "< Back",
            LinkToNextPageFormat = "Forth >",
            LinkToLastPageFormat = "End >>"
        }
    )
}

検索フォームは部分的なビューとして表示されます。

@using(Html.BeginForm("Search", "Employee", FormMethod.Get, new { @class = "search-form" }))
{
    <p>
        @Html.TextBox("value")
    </p>
    <p>
        @Html.RadioButton("filter", "by-name", true) By name <br/>
        @Html.RadioButton("filter", "by-empn") By empn <br/>
    </p>
    <p>
        <input type="image" src="@Url.Content("~/Content/Images/Search.png")" />
    </p>
}

問題:Nページリンクがあります。2番目のページに移動しようとすると、リダイレクトの無限ループに直面します。それが私のアクションを実装した方法です-デフォルトのケースが発生します。filter/valueでは、値はnull2番目のアクション呼び出しにありますか?なんで?検索アクションをリファクタリングするにはどうすればよいですか?

また、そのようなアクションのルートをどのように構成する必要がありますか?

ありがとう!

編集

したがって、検索アクションのルートは次のようになります。

routes.MapRoute(
    null,
    "{controller}/{action}/Page{page}/filter{filter}/val{value}",
    new { controller = "Employee", action = "Search" }
);

編集2

したがって、次に書くことが可能です:

page => Url.Action("Search", new { filter = ViewBag.SearchFilter, value = ViewBag.SearchValue, page = page }),

そしてコントローラーの内部:

public ActionResult Search(String filter, String value, Int32? page) {

    ViewBag.SearchFilter = filter;
    ViewBag.SearchValue = value;
    // ...
}

これは正しいですか?

4

1 に答える 1

1

では、フィルター/値の値は2番目のアクション呼び出しでnullになりますか?なんで?

対応する入力フィールドは別のフォーム内にあり、サーバーに送信されることはないためです。

カスタムHtml.PagedListPagerヘルパー(表示していないコード)を使用しているようですが、このヘルパーはページリンクをアンカーとして生成し、現在のクエリ文字列やPOST値を生成するときにそれらを考慮しないと思いますリンク。したがって、hrefページネーションリンクのは/SomeController/Search?page=5、これらのパラメータを考慮に入れる正しいリンクではなく、次のようになります/SomeController/Search?page=5&filter=somefilter&value=somevalue

filterこれで、コントローラーアクションのパラメーターとvalueパラメーターが常にnullである理由を簡単に理解できます。これは、ページネーションリンクをクリックしたときにサーバーに送信しないためです。

したがって、この問題を解決するために、ページネーションリンクを生成するために使用しているこのカスタムHTMLヘルパーを変更して、これらの追加パラメーターを含めることができます。または、ヘルパーで追加のパラメーターを渡すことができますか?これが使用しているサードパーティのプラグインである場合は、ドキュメントを確認してください。

于 2012-05-15T11:10:58.443 に答える