MVC QueryString en objeto dynamic

¿Hay una manera de rellenar un objeto dynamic con parámetros de cadena de consulta?

Esto es para que mis parámetros de búsqueda en el QS puedan variar sin vincularlos directamente a un objeto contenedor o tener que cambiar la firma del método de búsqueda.

p.ej

URL entrante: www.test.com/Home/Search?name=john&product=car&type=open&type=all

public ActionResult Search() { dynamic searchParams = // **something magic here** var model = getResults(searchParams); return View(model); } 

El objeto searchParams poblado debe verse como:

 { name = "john", product = "car", type = { "open", "all" } } 

¿Algunas ideas?

Una solución puede ser que construya un ExpandoObject a partir de Request.QueryString, que es un NameValueCollection .

Es fácil escribir la transformación y puedes ponerla dentro de un método de extensión:

 public static class NameValueCollectionExtensions: { public static dynamic ToExpando(this NameValueCollection valueCollection) { var result = new ExpandoObject() as IDictionary; foreach (var key in valueCollection.AllKeys) { result.Add(key, valueCollection[key]); } return result; } } 

Y en tu controlador puedes usar como:

 public ActionResult Search() { dynamic searchParams = Request.QueryString.ToExpando(); DoSomething(searchParams.name); var model = getResults(searchParams); return View(model); } 

Nota: Necesitará realizar alguna transformación adicional para manejar la propiedad de type que no será automáticamente una matriz de forma predeterminada.

Algo como esto haría el truco

 dynamic searchParams = new { name = "john", product = "car", type = new {aa = "open", bb = "all"} }; 

Cambiando las cadenas por los valores de cadena de su consulta.

Prefiero usar el objeto dynamic y hacer lo siguiente:

 public class QSValues : DynamicObject { readonly Dictionary dynamicProperties = new Dictionary(); public string ErrorMessage { get; set; } public bool IsSuccessful { get; set; } public override bool TrySetMember(SetMemberBinder binder, object value) { dynamicProperties[binder.Name] = value; return true; } public override bool TryGetMember(GetMemberBinder binder, out object result) { return dynamicProperties.TryGetValue(binder.Name, out result); } 

y luego analizar los parámetros QueryString