Как мне создать правильные значения маршрута для этого 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 Я вижу, что свойства объекта передали адрес, но я не могу добавить параметр "page".

5 ответов

Думаю, что было бы лучше создать другой объект с правильными значениями, а не использовать (и, возможно, изменить текущие значения маршрута):

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

Этот пост в блоге Скотта Гатри помог мне разобраться в маршрутизации URL: ASP.NET MVC Framework (часть 2): маршрутизация URL

Мне нравится, что он включал тестовые случаи!

Вам нужно переопределить ToString().

Если вы используете Razor (я понимаю, что OP спросили четыре года назад, прежде чем Razor был изобретен, но люди, находящие это, возможно, используют его).

Я смог заставить что-то работать, используя встроенный метод @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 или в случае ОП page,

Вам нужно использовать RouteLink вместо ActionLink. Ваш код должен выглядеть примерно так

@Html.RouteLink("Next", new {controller = "SearchResults", action = "Index", search=samevalue, page=1 }) 
Другие вопросы по тегам