2

値のリストを 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 はダンプされます。基本的には、QueryString に value=int[] を追加する .ToString() を呼び出します。

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 として渡すにはどうすればよいでしょうか。int[] を処理するために MVC に追加できる方法はありますか? それとも、基礎となるディクショナリ ベースのデータ構造は、値のリストを ASP.NET MVC に簡単に渡すためのショーストッパーですか?

4

1 に答える 1

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/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"]) 
于 2009-11-30T12:40:04.040 に答える