문제

값 목록을 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에 전달할 때 덤프됩니다. 기본적으로 내 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에 쉽게 전달하기 위한 쇼 스토퍼입니까?

도움이 되었습니까?

해결책

나는 새로운 클래스 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"]) 
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top