Pregunta

Actualmente estoy trabajando en una aplicación MVC razonablemente simple que le permite al usuario ingresar algunos datos de búsqueda, obtener una lista de resultados, luego ver cada elemento, etc. Todo va bastante bien, sin embargo, ahora estoy tratando de implementar paginando pero teniendo algunos problemas.

Mi formulario de búsqueda utiliza HTTP GET, solicitando la siguiente acción:

public ActionResult Results(PropertySearchData data, int? page)
{
    ...
    IEnumerable<Property> search = mService.SearchProperties(data);

    ViewData["SearchData"] = data;
    return View("Results", "Site", search.ToPagedList(page ?? 0, 20));
    ...
}

Desde aquí, compilo mi tabla de resultados de la colección IEnumerable que pasé a mi vista. Además, he usado ViewData para mantener los parámetros de búsqueda para poder pasarlos cuando el usuario solicita una página diferente.

Por ejemplo, para llegar a la primera página, me gustaría usar algo como esto:

Html.ActionLink("First", "Results", new { data = ViewData["SearchData"], page = 1 })

Sin embargo, cuando se genera este enlace, mi enlace está en la línea de

/Results?data=PropertySearchData&page=1

Si elimino el parámetro 'página' por completo, y solo paso ViewData [" SearchData "] como mi valor de ruta, mi enlace se genera como me gustaría (es decir, cada miembro de PropertySearchData se pasa como una cadena de consulta a través de la función de enlace del modelo. Supongo que esto se debe a que el enlace del modelo solo puede funcionar correctamente cuando ha especificado un solo tipo?

Puedo ver varias razones por las que esto no funciona; con lo que estoy teniendo problemas es encontrar la manera "agradable" de hacer lo que estoy tratando de hacer. Sé que debo faltar una pieza vital de comprensión aquí, por lo que sería muy apreciado si puedo obtener algunos consejos sobre cómo abordar esto.

Tenga en cuenta que realmente quiero seguir con HTTP GET (ya que esta es una página de resultados de búsqueda).

¡Gracias!

¿Fue útil?

Solución

El problema es que el método de ayuda es solo intentarlo, es mejor generar algo de lo que le has dado y ese es un objeto con dos propiedades: datos y página.

Para obtener el número de página, puede hacer uso de un diccionario de valores de ruta (que probablemente sea lo que se hace debajo del capó) y hacer uso de la anulación que acepta un IDictionary: -

//In some HtmlHelper extension method or something 
var searchCriteria = new RouteValueDictionary(ViewData["searchData"]);
searchCriteria.Add("page", 1);

return Html.ActionLink("First", "Results", searchCriteria)

Otros consejos

Dado que data o ViewData [" SearchData "] es en la instancia de PropertySearchData supongo que Html.ActionLink está llamando a ToString () en él y no está dando el resultado esperado.

Crear un método de extensión HtmlHelper no sería la mejor manera de resolver esto. No agregará funcionalidad general, solo más desorden (visual) ...

La sobrecarga routeValues ??de Html.ActionLink espera un objeto o RouteValueCollection (IDictionary). Ahora está utilizando la sobrecarga de objetos (ya que el nuevo constructor {} es un objeto anónimo).

Puede usar lo siguiente para crear el parámetro routeValues ??correcto:

new RouteValueCollection(ViewData["SearchData"]) { { "page", 1 } }

Esto inicializa una nueva RouteValueCollection con los datos de búsqueda actuales y luego agrega la tecla 'página' con el nuevo valor (se sobrescribe si existe en los datos de búsqueda).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top