2009-11-27 5 views
16

Модель SearchResults.aspx является примером PersonSearch; когда запрос на получение новой страницы (запрос GET), метод действия должен принять его и вычислить новые результаты.Как создать правильные значения маршрута для этого ActionLink?

[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 я могу видеть свойство объекта передается адрес, но я не могу добавить параметр «Страница» ,

ответ

24

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

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

я получаю: SearchResults поиск = RegistryManager.Models.PersonSearch и страница = 1 – gremo

+4

Не работает ... он передает имя класса, а не ключ/значения пары, соответствующие свойства объекта ... – gremo

3

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

2

Если вы используете 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 или в случае с OPs page.

1

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

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