2

私は、拡張可能な方法でデータをフィルタリングできる必要があるASP.NETMVCプロジェクトに取り組んでいます。単一のフィルター基準を表すためにクラスを使用することにしました(Dictionaryこの時点でそれが可能である可能性があることは承知していますが、後で他のプロパティを追加する必要があるかもしれません):

public class FilterCriterion
{
    public string FilterName { get; set; }

    public string FilterValue { get; set; }
}

そして、これは私が念頭に置いていたコントローラーメソッドのシグネチャであり、フィルター処理されたデータを返します。

public JsonResult GetMultipleShowDetailsByFilter(IEnumerable<FilterCriterion> filters, int pageNumber, int itemsPerPage)

このメソッドは(JavaScriptを使用して)Webページから呼び出され、ページに表示されるエンティティのセットを含むJSONを返します。

生の状態で引数を受け入れ、を実装する列挙可能なオブジェクトを作成する、ある種のコンバーターが必要になると思いますIEnumerable<FilterCriterion>。を使用できるかもしれModelBinderませんが、方法がよくわかりません。

私を正しい方向に動かしてくれませんか?ありがとう。

編集:私は提案されたように配列を渡しません。コントローラにステップインすると、内部に正しい数のアイテムがありますfiltersが、それらのプロパティ(FilterNameとFilterValueの両方)はnullです。以下に、完全なコードとフィルターオブジェクトの内容をクライアント側に投稿します。私は何が間違っているのですか?Javscriptコード:

function filterChanged() {
    var activeFilters = $(':checked');
    var filters = new Array();
    $.each(activeFilters, function (i, val) {
        var newItem = new Object();
        newItem.FilterName = $(val).attr('data-filter-type');
        newItem.FilterValue = $(val).attr('data-filter-value');
        filters[i] = newItem;
    });

    $.getJSON('../DatabaseApi/GetMultipleShowDetailsByFilter',
        {
            'filters': filters,
            'pageNumber': 1,
            'itemsPerPage': 10
        },
        function(data) {
            fill(data);
        });
}

作成されたオブジェクトはどのように見えますか(VSイミディエイトウィンドウから取得されたデータがあることの証明):

?filters
[[object Object],[object Object]]
    [0]: {...}
    [1]: {...}
    [prototype]: []
?filters[0]
{...}
    [prototype]: {...}
    FilterName: "Genre"
    FilterValue: "Animation"
4

2 に答える 2

3
  1. コントローラーの署名を次のように変更します

    public JsonResult GetMultipleShowDetailsByFilter(FilterCriterion[] filters, int pageNumber, int itemsPerPage)
    
  2. 次のPOST構造を使用します。

    filters[0].FilterName = 'aaa'
    filters[0].FilterValue = 'bbbb'
    filters[1].FilterName = 'ccc'
    filters[1].FilterValue = 'ddd'
    ...
    filters[n].FilterName = 'xxx'
    filters[n].FilterValue = 'yyy'
    

    (jQueryで簡単にできます)

1 つの注意点: インデックスの番号付けは連続している必要があります。つまり、ギャップがあってはなりません。

トピック スターターの更新に更新: 構造には十分注意する必要がありますPOST。ネストされた JavaScript オブジェクトは機能しません。これを使ってみてください:

function filterChanged() {
    var activeFilters = $(':checked');
    var data = {
        'pageNumber': 1,
        'itemsPerPage': 10
    }
    $.each(activeFilters, function (i, val) {
        data['filters[' + i + '].FilterName'] = $(val).attr('data-filter-type');
        data['filters[' + i + '].FilterValue'] = $(val).attr('data-filter-value');
    });

    $.getJSON('../DatabaseApi/GetMultipleShowDetailsByFilter',
        data,
        function(data) {
            fill(data);
        });
}
于 2012-07-28T19:53:28.547 に答える
2

このリンクを参照してください。ここでは、プラグインがToDictionaryうまく機能し、これらの問題を解決し、コードをよりクリーンにすることができます。

JS:

function filterChanged() {

    var filters = [];
    $(':checked').each(function (i, el) {
        filters.push({
            'FilterName': $(this).data('filter-type'),
            'FilterValue': $(this).data('filter-value')
        });
    });

    var data = $.toDictionary({
        'filters': filters,
        'pageNumber': 1,
        'itemsPerPage': 10
    });

    var response = function (data) {
        fill(data);
    };

    $.getJSON('../DatabaseApi/GetMultipleShowDetailsByFilter', data, response);
}

応答に基づく:リンク

于 2012-07-28T22:03:43.917 に答える