2009-11-30 7 views
2

L'approche recommandée pour les listes de valeurs passage comme QueryString estASP.NET MVC Passer Listes à RouteData QueryString

www.site.com/search?value=1&value=2&value=3&value=4 

gère ASP.NET bien:

string value = QueryString.Get("value"); // returns "1,2,3,4" 

Mais je ne peux pas trouver un moyen de transmettre ces valeurs dans RouteData. L'approche évidente serait d'ajouter

int[] value = {1,2,3,4}; 

dans le RouteData et ont de super choses intelligentes de tri MVC pour moi. Malheureusement MVC est dump quand il s'agit de passer des tableaux dans RouteData, il appelle essentiellement .ToString() en ajoutant valeur = int [] à ma chaîne de requête.

J'ai essayé d'ajouter les valeurs à RouteValueDictionary (mais étant un dictionnaire ne peut pas gérer ça :)

RouteValueDictionary dict = new RouteValueDictionary(); 
dict.Add("value","1"); 
dict.Add("value","2"); // Throws Exception (Keys must be unique) 

Je pourrais essayer passer des valeurs comme ceci:

www.site.com/search?value=1,2,3,4 

mais cela est encodée à l'URL comme

www.site.com/search?value=1%2C2%2C3%2C4 

Je ne sais pas si c'est une mauvaise chose ou pas, mais ça a l'air ré. Donc, comment passez-vous les listes de valeurs en tant que RouteData dans ASP.NET MVC. Y at-il un moyen que je peux ajouter à MVC pour le faire gérer un int []? Ou la structure de données basée sur un dictionnaire sous-jacent est-elle un outil de blocage permettant de transmettre facilement des listes de valeurs à ASP.NET MVC?

Répondre

3

Je suis venu avec une solution à moi-même en faisant une nouvelle classe RouteDataList()

public class RouteDataList<T> : List<T> 
{ 
    public RouteDataList(IEnumerable<T> enumerable) : base(enumerable) { } 

    public RouteDataList() : base() { } 

    public override string ToString() 
    {    
     string output = ""; 
     for (int i = 0; i < this.Count; i++) 
     { 
      output += i < this.Count - 1 ? this[i] + "-" : this[i].ToString(); 
     } 

     return output; 
    } 

    public static List<Int32> ParseInts(string input) 
    { 
     if (String.IsNullOrEmpty(input)) return null; 

     List<Int32> parsedList = new List<int>(); 
     string[] split = input.Split('-'); 
     foreach (string s in split) 
     { 
      int value; 
      if(Int32.TryParse(s, out value)) parsedList.Add(value); 
     } 
     return parsedList; 
    } 
} 

Utilisation comme suit:

RouteDataList<Int32> valuelist = new RouteDataList<Int32>(){5,6,7,8}; 
RouteDataList<Int32> anothervaluelist = new RouteDataList<Int32>(){12,13,14,15}; 

passe ensuite à une fonction qui prend une RouteValueDictionary/Type Anonyme:

return RedirectToAction("View", "Browse", new {valuelist, anothervaluelist }); 
// Produces http://www.site.com/browse/view?valuelist=5-6-7-8&anothervaluelist=12-13-14-15 

// To Parse back to a list: 
List<Int32> values = RouteDataList<Int32>.ParseInts(HttpContext.Current.Request.QueryString["valuelist"]) 
Questions connexes