2009-11-27 14 views
16

El modelo de SearchResults.aspx es una instancia de PersonSearch; cuando llega la solicitud de una nueva página (una solicitud GET), el método de acción debe tomarla y calcular los nuevos resultados.¿Cómo creo los valores de ruta correctos para este 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); 
} 

entonces tengo que generar los anteriores/siguientes enlaces:

<%= Html.ActionLink("Next Page >", "SearchResults", routeValues) %> 

Si uso routeValues = ViewData.Model puedo ver las propiedades de los objetos pasaron la dirección, pero no puedo agregar el parámetro "página" .

Respuesta

24

Se piensa que sería mejor crear otro objeto con los valores correctos, en lugar de utilizar (y potencialmente alterar las actuales routevalues):

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

me sale:? = SearchResults buscar RegistryManager.Models.PersonSearch & page = 1 – gremo

+4

No funciona ... se pasa el nombre de la clase, no la clave/valor que corresponde a pares las propiedades del objeto ... – gremo

3

Necesita anular ToString().

2

Si usa Razor (me doy cuenta de que OP lo solicitó hace cuatro años antes de que se inventara Razor, pero las personas pueden encontrarlo tal vez utilizándolo).

Pude hacer algo funcionando mediante el método @helper en línea.

@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) 
} 

uso sería simple -

@RunnerLink(myPersonSearchInstance, 1) 

No es la solución más elegante, pero funciona bien si quieres pasar un objeto en un routeValue, pero hay que pasar artículos adicionales, como Controller, Area o en caso de OPs page.

1

Necesita utilizar RouteLink en lugar de ActionLink. El código debería ser algo como esto

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