c# - mvc - ¿Cómo creo los valores de ruta correctos para este ActionLink?
html actionlink structure (5)
Esta publicación del blog de Scott Guthrie me ayudó a envolver mi cabeza en Enrutamiento de URL: ASP.NET MVC Framework (Parte 2): Enrutamiento de URL
Me encanta que incluyera casos de prueba!
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.
[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);
}
Luego tengo que generar los enlaces anteriores / siguientes:
<%= Html.ActionLink("Next Page >", "SearchResults", routeValues) %>
Si uso routeValues = ViewData.Model
puedo ver que las propiedades del objeto pasaron la dirección, pero no puedo agregar el parámetro "página".
Necesitas anular ToString ().
Necesitas usar RouteLink en lugar de ActionLink. Tu código debe verse algo como esto
@Html.RouteLink("Next", new {controller = "SearchResults", action = "Index", search=samevalue, page=1 })
Piensa que sería mejor crear otro objeto con los valores correctos, en lugar de usar (y potencialmente alterar los valores de enrutamiento actuales):
<%=Html.ActionLink("Next Page >", "SearchResults", new {
search = this.Model,
page = 1 //or whatever
}) %>
Si está utilizando Razor (me doy cuenta de que OP preguntó hace cuatro años antes de que Razor se inventara, pero la gente puede encontrarlo tal vez usándolo).
Pude hacer que algo funcionara utilizando un 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)
}
El uso sería simple -
@RunnerLink(myPersonSearchInstance, 1)
No es la solución más elegante, pero funciona bien si quiere pasar un objeto como routeValue, pero necesita pasar elementos adicionales, como Controller
, Area
o en la page
caso de OPs.