SearchResults.aspx
のモデルはPersonSearch
のインスタンスです。新しいページのリクエストが到着すると(GETリクエスト)、アクションメソッドはそれを受け取り、新しい結果を計算します。
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult SearchResults(PersonSearch search, int? page)
{
ViewData["Results"] = new PaginatedList<Person>(_searchService.FindPersons(search), page ?? 0, 1);
return View("SearchResults", search);
}
次に、前/次のリンクを生成する必要があります。
<%= Html.ActionLink("Next Page >", "SearchResults", routeValues) %>
routeValues = ViewData.Model
を使用すると、アドレスに渡されたオブジェクトプロパティを確認できますが、「ページ」パラメーターを追加できません。
使用する(および現在のルート値を変更する可能性がある)代わりに、正しい値で別のオブジェクトを作成する方が良いと思います。
<%=Html.ActionLink("Next Page >", "SearchResults", new {
search = this.Model,
page = 1 //or whatever
}) %>
Scott Guthrieによるこのブログ投稿は、URLルーティングに頭を抱えるのに役立ちました: ASP.NET MVC Framework(Part 2):URL Routing
私は彼がテストケースを含めたことを愛しています!
ToString()をオーバーライドする必要があります。
Razorを使用している場合(OPはRazorが発明される前に4年前に尋ねられたことに気づきますが、これを使用していると思われる人はおそらくそれを使用しています)。
インライン@helperメソッドを使用して何かを動作させることができました。
@helper RunnerLink(PersonSearch model, int page)
{
var routeParms =new RouteValueDictionary(model.GetType().GetProperties().ToDictionary(p => p.Name, p => p.GetValue(model, null)));
routeParms.Add("page", page.ToString());
routeParms.Add("Controller", "Property");
@Html.ActionLink("Search", "Index", routeParms)
}
使い方は簡単でしょう-
@RunnerLink(myPersonSearchInstance, 1)
これは最もエレガントなソリューションではありませんが、オブジェクトをrouteValueとして渡す場合はうまく機能しますが、Controller
、Area
などの追加のアイテムを渡す必要がありますOPケースpage
。
ActionLinkの代わりにRouteLinkを使用する必要があります。コードは次のようになります
@Html.RouteLink("Next", new {controller = "SearchResults", action = "Index", search=samevalue, page=1 })