将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参数