私はそのような行動方法を持っています:
[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
では、値はnull
2番目のアクション呼び出しにありますか?なんで?検索アクションをリファクタリングするにはどうすればよいですか?
また、そのようなアクションのルートをどのように構成する必要がありますか?
ありがとう!
編集
したがって、検索アクションのルートは次のようになります。
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;
// ...
}
これは正しいですか?