将MVC QueryString转换为动态对象

有没有办法用Query String参数填充Dynamic对象?

这样我的QS中的搜索参数可以变化,而不会将它们直接绑定到容器对象或者必须更改搜索方法的签名。

例如

入站url: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); } 

填充的searchParams对象应如下所示:

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

有任何想法吗?

一种解决方案可以是从Request.QueryString构建一个ExpandoObject ,它是一个NameValueCollection 。

编写转换很容易,你可以将它放在扩展方法中:

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

在您的控制器中,您可以使用如下:

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

注意:您需要进行一些额外的转换来处理type属性,默认情况下该属性不会自动成为数组。

像这样的东西可以解决问题

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

替换查询字符串值的字符串。

我宁愿使用动态对象并执行以下操作:

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

然后解析QueryString参数