2012-07-17 72 views
5

有没有一种方法来填充动态对象与查询字符串参数?MVC QueryString到动态对象

这是为了使我在QS中的搜索参数可以变化,而不将它们直接绑定到容器对象或不得不更改搜索方法的签名。

例如

入站网址:www.test.com/Home/Search?name=john &产品=汽车&类型=开放&类型=所有

public ActionResult Search() 
{ 
    dynamic searchParams = // **something magic here** 

    var model = getResults(searchParams); 
    return View(model); 
} 

的填充searchParams对象应该是这样的:

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

任何想法?

回答

9

一个解决方案可以是您从Request.QueryString这是一个NameValueCollection建立ExpandoObject

很容易写的转变,你可以把它扩展方法中:

public static class NameValueCollectionExtensions: 
{ 
    public static dynamic ToExpando(this NameValueCollection valueCollection) 
    { 
     var result = new ExpandoObject() as IDictionary<string, object>; 
     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属性,默认情况下它不会自动成为一个数组。

+0

我同意,这将是一个很好的可重复使用的包装来解决这个问题。 – stevethethread 2012-07-17 09:50:39

+0

已经尝试过这种'type'属性被解析为一个csv字符串,因此它是完全可用的。谢谢! – Nick 2012-07-17 10:15:12

0

像这样的事情会做的伎俩

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

您的查询字符串值换出字符串。

+0

谢谢你的回答。我考虑过这种方法,但它仍然使我不得不知道构建这个对象时要查找什么值。 – Nick 2012-07-17 10:17:03

+0

是的,在这种情况下,@ nemesv的答案看起来不错。 – stevethethread 2012-07-17 10:19:10

0

我宁愿使用动态对象,并做如下:

public class QSValues : DynamicObject 
    { 
     readonly Dictionary<string, object> dynamicProperties = new Dictionary<string, object>(); 

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

,然后解析查询字符串参数

+0

我宁愿使用接受的答案,但感谢您通过继承来展示它是如何实现的。 – Nick 2012-07-17 10:18:01