将MVC QueryString转换为动态对象

时间:2012-07-17 09:38:04

标签: c# asp.net-mvc

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

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

e.g。

入站网址: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" }
}

有什么想法吗?

3 个答案:

答案 0 :(得分:9)

一种解决方案可能是您从ExpandoObject Request.QueryString建立NameValueCollection

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

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属性,默认情况下该属性不会自动成为数组。

答案 1 :(得分:0)

这样的事情可以解决问题

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

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

答案 2 :(得分: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);
        }

然后解析QueryString参数