2010-02-11 21 views
6

me gustaría generar una nueva dirección URL basada en la ruta existente, sino que añadirá un nuevo parámetro 'página'
He aquí algunos ejemplos:
Url.Action basado en la ruta actual

antigua: ? ~/localhost/algo de lo = 2
nueva: ~/localhost/algo de lo = 2 & page = 5

viejos:? ~/localhost/Zapatos
nueva: ~/localhost/Zapatos/5

No puedo agregar & página = 5 a la url existente porque las rutas pueden ser diferentes.
Algunos usan la cadena de consulta y otros no.

Respuesta

6

Tuve un problema similar y adopté el enfoque de extender el UrlHelper. El código en la vista se parece a:

<a href="<%= Url.AddPage(2) %>">Page 2</a> 

La extensión UrlHelper parece:

using System.Web.Mvc; 
using System.Web.Routing; 
using System.Collections.Specialized; 

public static class UrlHelperExtension 
{ 
    public static string AddPage(this UrlHelper helper, int page) 
    { 

     var routeValueDict = new RouteValueDictionary 
     { 
      { "controller", helper.RequestContext.RouteData.Values["controller"] }, 
      { "action" , helper.RequestContext.RouteData.Values["action"]} 
     }; 

     if (helper.RequestContext.RouteData.Values["id"] != null) 
     { 
      routeValueDict.Add("id", helper.RequestContext.RouteData.Values["id"]); 
     } 

     foreach (string name in helper.RequestContext.HttpContext.Request.QueryString) 
     { 
      routeValueDict.Add(name, helper.RequestContext.HttpContext.Request.QueryString[name]); 
     } 

     routeValueDict.Add("page", page); 

     return helper.RouteUrl(routeValueDict); 
    } 
} 

Un par de notas: verifico para la identificación, ya que no lo uso en todos mis rutas . Agrego el valor de la ruta de la página al final, por lo que es el último parámetro de url (de lo contrario, podría agregarlo en el constructor inicial).

0

Puede reconstruir una url sacando las partes de la ruta existente por medio del objeto RouteData. Por ejemplo, la siguiente haría una URL con el controlador y la acción de la ruta actual:

<%=Url.RouteUrl(new { controller = ViewContext.RouteData.Values["controller"], 
         action = ViewContext.RouteData.Values["action"] }) %> 

Para empezar, usted podría ir con algo así como un método de extensión personalizada que genera la URL con una página adicional" "parámetro. Ajuste según sea necesario:

public static string UrlWithPage(this UrlHelper urlHelper, string name, int page) 
    { 
     string url = urlHelper.RouteUrl(
      new { 
        controller = urlHelper.RequestContext.RouteData.Values["controller"], 
        action = urlHelper.RequestContext.RouteData.Values["action"], 
        id = urlHelper.RequestContext.RouteData.Values["id"], 
        page = page 
       } 
      ); 

     return "<a href=\"" + url + "\">" + name + "</a>"; 
    } 

éste construirá de un enlace con el formato adecuado en base a la configuración de enrutamiento, si la página es el segmento real en la url o simplemente añade como una cadena de consulta.

+0

El número de parámetros que tengo en la ruta no es constante? . Puedo tener 10 o tener solo 1 (id en su ejemplo). –

+0

Tendré que aceptar esto ya que no hay otras respuestas :) –

1

Esto parece como una buena aproximación:

// Clone Current RouteData 
var rdata = new RouteValueDictionary(Url.RequestContext.RouteData.Values); 

// Get QueryString NameValueCollection 
var qstring = Url.RequestContext.HttpContext.Request.QueryString; 

// Pull in QueryString Values 
foreach (var key in qstring.AllKeys) { 
    if (rdata.ContainsKey(key)) { continue; } 
    rdata[key] = qstring[key]; 
} 

// Update RouteData 
rdata["pageNo"] = "10"; 

// Build Url 
var url = Url.RouteUrl(rdata); 

y evita colisiones tal como el controlador = ejemplo & action = problema etc.

Cuestiones relacionadas