2012-02-15 11 views
14

mi piacerebbe tornare un RedirectToRouteResult che invia agli utenti di un URL simile al seguente:Crea RouteValueDictionary con le chiavi multivalore

/MyController/MyAction/id?newid=3&newid=5&newid=7 

Il parametro newid ha diversi valori.

Il mio invito si presenta come: return RedirectToAction(string.Empty, routeValues);

Ecco quello che ho provato finora, e che non funzionano:

// ...?newid%5B0%5D=3&newid%5B1%5D=5&newid%5B2%5D=7 
var routeValues = new RouteValueDictionary { 
    {"id", myid}, 
    {"newid[0]", 3}, 
    {"newid[1]", 5}, 
    {"newid[2]", 7}, 
}; 

// ...?newid=System.Int32%5B%5D 
var routeValues = new { id = myid, newid = new int[] { 3, 5, 7 } }; 

// ...?newid=System.String%5B%5D 
var routeValues = new { id = myid, newid = new string[] { "3", "5", "7" } }; 

// ...?newid=System.Int32%5B%5D 
var routeValues = new RouteValueDictionary { 
    {"id", myid}, 
    {"newid", new int[] { 3, 5, 7 } } 
}; 

Qual è il segreto per fare questo lavoro?

risposta

13

Questa è una cosa che manca davvero nel framework. La soluzione migliore è stamparla manualmente:

public ActionResult Foo() 
{ 
    var ids = new[] { 3, 5, 7 }; 
    var url = new UriBuilder(Url.Action("MyAction", "MyController", new { id = "123" }, Request.Url.Scheme)); 
    url.Query = string.Join("&", ids.Select(x => "newid=" + HttpUtility.UrlEncode(x.ToString()))); 
    return Redirect(url.ToString()); 
} 

Mettere questo in un metodo di estensione personalizzato potrebbe aumentare la leggibilità, naturalmente.

+0

+1 Soluzione elegante, Darin. –

+0

Grazie - funziona alla grande! (Rende il test un po 'più difficile - devi prendere in giro il contesto del controller e UrlHelper - ma immagino che sia proprio così.) –

0

Sono stato nel caso in cui non conosco nemmeno i nomi dei tasti che forniscono più volte. E dal momento che la querystring accetta più chiavi come lista separata da virgola. Ho trovato utile scrivere un metodo di estensione basato sulla risposta di Darin.

public static UriBuilder TransformToMultiplyKeyUrl(this RouteValueDictionary self, string baseUrl) 
    { 
     var url = new UriBuilder(baseUrl); 
     //Transform x=y,z into x=y&x=z 
     url.Query = String.Join("&", 
      self.SelectMany(
       pair => ((string)pair.Value).Split(',') 
        .Select(v => String.Format("{0}={1}", pair.Key, HttpUtility.UrlEncode(v))))); 
     return url; 
    } 
Problemi correlati