Frage

Die empfohlene Vorgehensweise für Wertelisten als Abfrage-Zeichenfolge vorbei ist

www.site.com/search?value=1&value=2&value=3&value=4

ASP.NET behandelt dies gut:

string value = QueryString.Get("value"); // returns "1,2,3,4"

Aber ich kann nicht einen Weg vorbei, diese Werte, indem sie in Routedata herauszufinden. Der offensichtliche Ansatz wäre hinzuzufügen

int[] value = {1,2,3,4};

in die Routedata und haben super intelligente MVC Art Dinge für mich. Leider Dump MVC ist, wenn es Arrays in Routedata zu vorbei kommt, ist es im Grunde ruft .ToString () einen Mehrwert = int [], um meine Abfrage-Zeichenfolge.

Ich habe versucht, das Hinzufügen der Werte Routevaluedictionary (aber ein Wörterbuch sein kann damit nicht umgehen:)

RouteValueDictionary dict = new RouteValueDictionary();
dict.Add("value","1");
dict.Add("value","2"); // Throws Exception (Keys must be unique)

Ich könnte versuchen, Werte wie folgt übergeben:

www.site.com/search?value=1,2,3,4

aber dies ist auf die URL Codiert als

www.site.com/search?value=1%2C2%2C3%2C4

Ich bin mir nicht sicher, ob dies eine schlechte Sache ist oder nicht, aber es sieht schlecht.

So, wie geben Sie Wertelisten als Routedata in ASP.NET MVC. Gibt es eine Möglichkeit, zu MVC hinzufügen kann, um es einen int zu machen handhaben []? Oder ist die zugrunde liegende Wörterbuch-basierte Datenstruktur eines Show-Stopper für Wertelisten leicht zu ASP.NET MVC geben?

War es hilfreich?

Lösung

Ich habe mit einer Lösung dieses Problem selbst kommen, indem sie eine neue Klasse 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;
    }
}

Verwenden Sie wie folgt vor:

RouteDataList<Int32> valuelist = new RouteDataList<Int32>(){5,6,7,8};
RouteDataList<Int32> anothervaluelist = new RouteDataList<Int32>(){12,13,14,15};

Führen Sie dann auf jede Funktion, die eine Routevaluedictionary / Anonymous Typ nimmt:

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"]) 
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top