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


person gremo    schedule 27.11.2009    source источник


Ответы (5)


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

<%=Html.ActionLink("Next Page >", "SearchResults", new {
    search = this.Model,
    page = 1 //or whatever
}) %>
person LorenzCK    schedule 27.11.2009
comment
Я получаю: SearchResults?search=RegistryManager.Models.PersonSearch&page=1 - person gremo; 27.11.2009
comment
Не работает... он передает имя класса, а не пары ключ/значение, соответствующие свойствам объекта... - person gremo; 27.11.2009

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

введите здесь описание изображениявведите здесь описание изображения

Мне нравится, что он включил тестовые примеры! введите здесь описание изображения

person SavoryBytes    schedule 05.10.2011

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

person Community    schedule 26.01.2010

Если вы используете Razor (я понимаю, что ОП спрашивал четыре года назад, до изобретения 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 или в случае OP page.

person Nate    schedule 02.04.2014

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

@Html.RouteLink("Next", new {controller = "SearchResults", action = "Index", search=samevalue, page=1 }) 
person Дмитрий Кононов    schedule 18.01.2018