2010-02-11 16 views
6

Vorrei generare un nuovo URL basato sulla rotta attuale, ma aggiungerà un nuovo parametro di 'pagina'
Ecco alcuni esempi:
Url.Action sulla base del percorso corrente

antiche: ? ~/localhost/qualcosa di quello che = 2
nuova: ~/localhost/qualcosa di quello che = 2 & page = 5

vecchi:? ~/localhost/Scarpe
nuova: ~/localhost/Scarpe/5

Non posso semplicemente aggiungere & pagina = 5 all'URL esistente perché i percorsi potrebbero essere diversi.
Alcuni usano la stringa di query e altri no.

risposta

6

Avevo un problema simile e ho preso l'approccio di estendere UrlHelper. Il codice nella vista appare come:

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

L'estensione UrlHelper assomiglia:

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 paio di note: verifico per l'ID, dato che non lo uso in tutti i miei percorsi . Aggiungo il valore del percorso Pagina alla fine, quindi è l'ultimo parametro url (altrimenti potresti aggiungerlo nel costruttore iniziale).

0

È possibile ricostruire un URL estraendo le parti della rotta esistente tramite l'oggetto RouteData. Per esempio, il seguente renderebbe un URL con il controller e l'azione del percorso attuale:

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

per iniziare, si potrebbe andare con qualcosa di simile a un metodo di estensione personalizzata che genera l'URL di una pagina aggiuntiva" "parametro. Regolare, se necessario:

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>"; 
    } 

Questa costruirà un collegamento correttamente formattato in base alla configurazione di routing, se la pagina è reale segmento nell'URL o semplicemente aggiunto come un querystring.

+0

Il numero di parametri che ho in percorso, non è costante? . Potrei averne 10 o averne solo 1 (id nel tuo esempio). –

+0

Dovrò accettare questo dato che non ci sono altre risposte :) –

1

questo mi sembra un buon approccio:

// 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); 

ed evita le collisioni, come regolatore = esempio & action = problema ecc

Problemi correlati