2009-11-30 2 views
2

Рекомендуемый подход для передачи списков значений в качестве QueryString являетсяASP.NET MVC Передача списков для RouteData QueryString

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

ASP.NET обрабатывает это хорошо:

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

Но я не могу выяснить способ передачи этих значений в RouteData. Очевидный подход можно было бы добавить

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

в RouteData и иметь супер умный MVC разберитесь для меня. К сожалению, MVC - это дамп, когда дело доходит до передачи массивов в RouteData, оно в основном вызывает .ToString() добавление value = int [] в мою QueryString.

Я попытался добавить значения в RouteValueDictionary (но, будучи словарь не может справиться с этим :)

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

Я мог бы попробовать прохождение значения, как это:

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

, но это закодированы URL-адрес

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

Я не уверен, что это плохо или нет, но он уверен, что выглядит ba д.

Итак, как вы передаете списки значений как RouteData в ASP.NET MVC. Есть ли способ, который я могу добавить в MVC, чтобы обработать int []? Или является основополагающей структурой данных на основе словарей show-stopper для простого переноса списков значений в ASP.NET MVC?

ответ

3

Я придумал решение, чтобы это сам, сделав новый класс 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; 
    } 
} 

Использование следующим образом:

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

затем перейти к любой функции, которая принимает RouteValueDictionary/Анонимный Тип:

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"])