2012-04-03 3 views
3

データフィルタを表す複雑なオブジェクトを、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"); 
} 

私はこの動作をf ROM javacriptのように:

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は、このように(つまりGETのコンテキストで)複雑なパラメータを適切にデシリアライズできないのですか?この問題に対処する正しい方法は何ですか?

+0

それは、デバッグなしで、あなたのケースで起こっている、まさに言うことが可能な、しかし難しい..:/ –

+0

aFilterに何が起こっているのか? – 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 

私はJavaScriptからそのパターンにマッチする文字列を構築する最も簡単な方法のわからないんだけどオブジェクトです。

3

Asp.net MVCのデータバインディングアルゴリズムは、.NET型の複雑な入力を逆シリアル化するのにはあまり適していません。最良のシナリオでは、他の専用ソリューションと比較して、奇妙な結果やパフォーマンスが低下します。この場合、Json.NETは、.NETタイプのjsonデータのデシリアライズ時にはるかに優れた結果を提供します。

通常の文字列パラメータのようにこれらのフィルタを渡す必要があります。アクション内では、Json.NETを使用して逆シリアル化します。このような何か:

using Newtonsoft.Json; 

public ActionResult MyAction(string myFilters) 
{ 
    var deserializedObject = JsonConvert.DeserializeObject(myFilters); 
} 
関連する問題