Pergunta

A abordagem recomendada para passar listas de valores como um QueryString é

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

ASP.NET lida com isso muito bem:

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

Mas eu não posso descobrir uma maneira de passar esses valores para RouteData. A abordagem óbvia seria a de adicionar

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

no RouteData e têm super inteligente coisas MVC classificar para fora para mim. Infelizmente MVC é despejo quando se trata de passar matrizes em RouteData, que basicamente chama .ToString () agregando valor = int [] à minha QueryString.

Eu tentei adicionar os valores a RouteValueDictionary (mas sendo um dicionário não pode lidar com isso:)

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

Eu poderia tentar passar valores como este:

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

mas isso é codificado para a URL como

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

Eu não tenho certeza se isso é uma coisa ruim ou não, mas com certeza parece ruim.

Então, como você passar listas de valores como RouteData em ASP.NET MVC. Existe alguma maneira eu posso adicionar ao MVC para torná-lo lidar com um int []? Ou é o subjacente estrutura de dados baseada em dicionário um show-rolha para passar listas de valores facilmente a ASP.NET MVC?

Foi útil?

Solução

Eu vim com uma solução para isso mesmo, fazendo uma nova classe 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;
    }
}

Use a seguinte:

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

Em seguida, passe para qualquer função que leva um RouteValueDictionary / tipo anônimo:

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"]) 
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top