2012-07-17 73 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