2012-07-17 12 views
5

C'è un modo per popolare un oggetto dinamico con parametri stringa di query?MVC QueryString nell'oggetto dinamico

Ciò consente ai miei parametri di ricerca nel QS di variare senza collegarli direttamente a un oggetto contenitore o dover modificare la firma del metodo di ricerca.

ad es.

URL in entrata: www.test.com/Home/Search?name=john & prodotto = auto & type = aperto & type = tutti

public ActionResult Search() 
{ 
    dynamic searchParams = // **something magic here** 

    var model = getResults(searchParams); 
    return View(model); 
} 

L'oggetto popolato searchParams dovrebbe essere simile:

{ 
    name = "john", 
    product = "car", 
    type = { "open", "all" } 
} 

Qualche idea?

risposta

9

Una soluzione può essere quella di creare uno ExpandoObject da Request.QueryString che è un NameValueCollection.

E 'facile scrivere la trasformazione e si può mettere dentro un metodo di estensione:

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

E nel controller è possibile utilizzare come:

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

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

Nota: Sarà necessario fare alcune trasformazioni aggiuntive per gestire la proprietà type che non sarà automaticamente una matrice per impostazione predefinita.

+0

Sono d'accordo che questo sarebbe un bel involucro riutilizzabile per risolvere il problema. – stevethethread

+0

Dopo averlo provato, la proprietà 'type' viene analizzata come una stringa csv, quindi è perfettamente utilizzabile così com'è. Grazie! – Nick

0

Qualcosa di simile a questo sarebbe fare il trucco

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

Sostituendo le corde per i vostri valori di stringa di query.

+0

Grazie per la risposta. Ho considerato questo approccio ma mi lega ancora a dover sapere quali valori cercare quando costruisci questo oggetto. – Nick

+0

Sì, in tal caso, la risposta di @ nemesv sembra piuttosto buona. – stevethethread

0

Avrei preferito utilizzare oggetto dinamico e facciamo seguire:

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

e quindi analizzare QueryString Parametri

+0

Preferirei usare la risposta accettata, ma grazie per aver mostrato come sarebbe possibile attraverso l'ereditarietà. – Nick