2012-02-15 5 views
14

me gustaría devolver un RedirectToRouteResult que envía a los usuarios a una URL como la siguiente:Crear RouteValueDictionary con las llaves de varios valores

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

El parámetro newid tiene varios valores.

Mi llamado es así: return RedirectToAction(string.Empty, routeValues);

Aquí es lo que he probado hasta ahora, y que no funcionan:

// ...?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 } } 
}; 

¿Cuál es el secreto para hacer este trabajo?

Respuesta

13

Eso es algo que realmente falta en el marco. Su mejor apuesta es hacer rodar 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()); 
} 

Poner esto en un método de extensión personalizada podría aumentar la legibilidad, por supuesto.

+0

+1 Elegant solution, Darin. –

+0

Gracias - ¡funciona genial! (Hace que las pruebas sean un poco más difíciles, tienes que burlarte del Context y del UrlHelper del controlador, pero supongo que así son las cosas). –

0

Estaba en el caso en que ni siquiera sé los nombres de las teclas que proporcionan múltiples veces. Y dado que la cadena de consulta acepta múltiples claves como una lista separada por coma. Me pareció útil escribir un método de extensión basado en la respuesta de 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; 
    } 
Cuestiones relacionadas