2012-07-17 14 views
5

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

QSの検索パラメータは、コンテナオブジェクトに直接バインドしたり、検索メソッドのシグネチャを変更したりすることなく変更できます。

インバウンドURL: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.QueryStringNameValueCollection)からExpandoObjectを構築することができます。

これは、変換を書くのは簡単だとあなたは、拡張メソッドの中に置くことができます。

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

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

注:あなたはなどを使用することができます

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

そして、あなたのコントローラーにあなたは何をする必要があります。 typeプロパティを処理するための追加の変換があります。これはデフォルトでは自動的に配列にはなりません。このような

+0

パラメータ。 – stevethethread

+0

これを試してみたところ、 'type'プロパティはcsv文字列として解析され、完全にそのまま使えるようになりました。ありがとう! – Nick

0

何かがあなたのクエリ文字列値の文字列をスワップアウトトリック

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

を行うだろう。

+0

ありがとうございます。私はこのアプローチを考えましたが、このオブジェクトを構築するときに探すべき値を知る必要があるということに私は依然として縛られています。 – Nick

+0

はい、その場合、@ nemesvの答えはかなり良く見えます。 – stevethethread

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を解析し、私はこの問題を解決するために素敵な再利用可能なラッパーになることに同意し

+0

私はむしろ受け入れられた答えを使用したいと思いますが、継承を通してどのように可能かを示すことに感謝します。 – Nick

関連する問題