RouteData QueryStringにリストを渡すASP.NET MVC
-
10-07-2019 - |
質問
値のリストを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()を呼び出して、QueryStringにvalue = int []を追加します。
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に渡すためのショーストッパーですか?
解決
新しいクラス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 Typeを受け取る関数に渡します:
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"])
所属していません StackOverflow