web-dev-qa-db-ja.com

このActionLinkの正しいルート値を作成するにはどうすればよいですか?

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を使用すると、アドレスに渡されたオブジェクトプロパティを確認できますが、「ページ」パラメーターを追加できません。

18
gremo

使用する(および現在のルート値を変更する可能性がある)代わりに、正しい値で別のオブジェクトを作成する方が良いと思います。

<%=Html.ActionLink("Next Page >", "SearchResults", new {
    search = this.Model,
    page = 1 //or whatever
}) %>
24
LorenzCK

Scott Guthrieによるこのブログ投稿は、URLルーティングに頭を抱えるのに役立ちました: ASP.NET MVC Framework(Part 2):URL Routing

enter image description hereenter image description here

私は彼がテストケースを含めたことを愛しています! enter image description here

6
daniellmb

ToString()をオーバーライドする必要があります。

3
user259437

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として渡す場合はうまく機能しますが、ControllerAreaなどの追加のアイテムを渡す必要がありますOPケースpage

2
Nate

ActionLinkの代わりにRouteLinkを使用する必要があります。コードは次のようになります

@Html.RouteLink("Next", new {controller = "SearchResults", action = "Index", search=samevalue, page=1 })