6

動的オブジェクトにクエリ文字列パラメータを設定する方法はありますか?

これは、コンテナ オブジェクトに直接バインドしたり、検索メソッドのシグネチャを変更したりすることなく、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" }
}

何か案は?

4

3 に答える 3

10

1 つの解決策は、 NameValueCollectionであるRequest.QueryStringから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注:デフォルトでは自動的に配列にならないプロパティを処理するには、追加の変換を行う必要があります。

于 2012-07-17T09:48:01.770 に答える
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パラメーターを解析します

于 2012-07-17T09:50:26.320 に答える
0

このような何かがうまくいくでしょう

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

クエリ文字列値の文字列を交換します。

于 2012-07-17T09:48:20.017 に答える