2012-04-03 1 views
3

데이터 필터를 나타내는 복잡한 개체를 GET을 사용하여 작업에 전달해야합니다. GET은 csv 파일에 필터링 된 데이터 집합을 반환합니다. ASP.NET MVC : GET 매개 변수가 제대로 역 직렬화되지 않았습니다.

var filter = { 
    Folders = [ 
    { Positive: true, Reference: { Id: 19, Name: "Container" } }, 
    { Positive: true, Reference: { Id: 37, Name: "Bullseye" } }, 
    ] 
} 

해당 서버 측 클래스

가 같을 :

public class MyFilter 
{ 
    public List<MyComparison> Folders { get; set; } 
} 
public class MyComparison 
{ 
    public bool Positive { get; set; } 
    public MyReference Reference { get; set; } 
} 
public class MyReference 
{ 
    public int Id { get; set; } 
    public string Name {get; set; } 
} 

필터 오브젝트 (간략화를 위해 단순화 실제로는 훨씬 더 복잡) 클라이언트 이런 뭔가 내 작업은 다음과 같습니다.

[HttpGet] 
public FileContentResult Export(MyFilter filter, string sort, bool sortAscending) 
{ 
    string data = GetCsvData(filter, sort, sortAscending); 
    return this.File(StrToByteArray(data), "text/csv", "Data.csv"); 
} 

ROM javacript like this :

function exportFilter(aFilter) { 
    var params = { filter: aFilter, sort: "Name", sortAscending: true }; 
    var destination = "MyController/Export?" + decodeURIComponent($.param(params)); 
    document.location = destination; 
} 

조치 내에서 sort 및 sortAscending 매개 변수가 모두 올바르게 채워집니다. 필터는 MyFilter 형식의 개체이지만 해당 Folders 속성은 null입니다.

ASP.NET MVC는 이러한 방식으로 복잡한 매개 변수를 적절하게 deserialize 할 수 있습니까 (즉, GET의 컨텍스트에서)? 이 문제를 해결하는 올바른 방법은 무엇입니까?

+0

그것은 당신의 경우에 벌어지고 정확하게 말을 할 수 있지만, 어려운 디버깅하지 않고 .../aFilter에 무슨 일이 일어나고 있는지 –

+0

을? – Dave

+0

aFilter는 첫 번째 코드 예제에서 "filter"와 같은 javascript 객체를 얻습니다. –

답변

2

복잡한 개체/매개 변수를 바인딩 할 수 있지만 문제는 매개 변수를 보내는 방법입니다.

http://localhost/Home/Export?filter[Folders][0][Positive]=true&filter[Folders][0][Reference][Id]=19&filter[Folders][0][Reference][Name]=Container&filter[Folders][1][Positive]=true&filter[Folders][1][Reference][Id]=37&filter[Folders][1][Reference][Name]=Bullseye&sort=Name&sortAscending=true 

을하지만 MVC 모델 바인더 형식 기대 : 예를 들어, 보내는

http://localhost/Home/Export?filter.Folders[0].Positive=true&filter.Folders[0].Reference.Id=19&filter.Folders[0].Reference.Name=Container&filter.Folders[1].Positive=true&filter.Folders[1].Reference.Id=37&filter.Folders[1].Reference.Name=Bullseye&sort=Name&sortAscending=true 

을 나는 자바 스크립트에서 해당 패턴과 일치하는 문자열을 구축 할 수있는 가장 쉬운 방법의 확실하지 않다 비록 개체.

3

Asp.net MVC의 데이터 바인딩 알고리즘은 .NET 유형의 복잡한 입력을 비 직렬화하는 데 그리 좋지 않습니다. 최상의 시나리오에서는 다른 전용 솔루션과 비교할 때 이상한 결과 및/또는 성능이 저하 될 수 있습니다. 이 경우 Json.NET은 .NET 유형의 json 데이터를 deserialize 할 때 훨씬 좋은 결과를 제공하며 매우 빠릅니다.

일반 문자열 매개 변수처럼 이러한 필터를 전달해야하며, 액션 내부에서 Json.NET을 사용하여 역 직렬화해야합니다. 이런 식으로 뭔가 :

using Newtonsoft.Json; 

public ActionResult MyAction(string myFilters) 
{ 
    var deserializedObject = JsonConvert.DeserializeObject(myFilters); 
}