2009-11-30 39 views
2

传递值的列表作为查询字符串推荐的方法是ASP.NET MVC传递列表来的RouteData查询字符串

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为我梳理事情。不幸的是,当涉及到将数组传递给RouteData时,MVC会转储,它基本上调用.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 d。

那么,如何在ASP.NET MVC中将RouteData的值列表传递为RouteData。有什么办法可以添加到MVC,使其处理int []?或者是基础的基于字典的数据结构是一种将值列表轻松传递给ASP.NET MVC的show-stopper?

回答

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"]) 
相关问题