c# - MVC QueryString 到动态对象

标签 c# asp.net-mvc

有没有办法用查询字符串参数填充动态对象?

这样一来,我在 QS 中的搜索参数就可以变化,而无需将它们直接绑定(bind)到容器对象或不必更改搜索方法的签名。

例如

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

有什么想法吗?

最佳答案

一个解决方案是您建立一个 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;
    }
}

在你的 Controller 中,你可以像这样使用:

public ActionResult Search()
{
    dynamic searchParams = Request.QueryString.ToExpando();

    DoSomething(searchParams.name);  
    var model = getResults(searchParams);
    return View(model);
}

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

关于c# - MVC QueryString 到动态对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11519824/

相关文章:

c# - 创建用于基于策略的授权期间拒绝访问的自定义页面

c# - 如何在WPF中获取移动形状的新位置

c# - 如何在 RDLC 字段中显示本地系统日期格式

c# - 具有许多注释表的多对象

asp.net-mvc - 在MVC Controller 构造函数中获取主机名

asp.net-mvc - 将 ASP.NET 应用程序部署到 Azure Web 应用程序时出现 HTTP 500.79 错误/System.UriFormatException

c# - Excel 上的 OLEDB 查询不带标题 : How do I specify Columns?

asp.net-mvc - 如何在不模拟的情况下对使用 UpdateModel 的操作进行单元测试?

asp.net-mvc - 何时使用路由与重写规则?

asp.net-mvc - 从 RouteTable 中检索路由值