ASP.NET MVC将列表传递给RouteData QueryString

时间:2009-11-30 11:37:47

标签: asp.net-mvc query-string 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为我排序。不幸的是,当将数组传递给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

我不确定这是不是坏事,但确实看起来很糟糕。

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

1 个答案:

答案 0 :(得分: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"])