【问题标题】:ASP.NET MVC Passing Lists to RouteData QueryStringASP.NET MVC 将列表传递给 RouteData QueryString
【发布时间】:2009-11-30 11:37:46
【问题描述】:

将值列表作为 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?

【问题讨论】:

    标签: asp.net-mvc query-string routedata


    【解决方案1】:

    我自己想出了一个解决方案,方法是创建一个新类 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/Anonymous 类型的函数:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-17
      • 1970-01-01
      • 1970-01-01
      • 2016-10-13
      • 1970-01-01
      • 2013-02-23
      • 2017-05-24
      • 1970-01-01
      相关资源
      最近更新 更多