控制器中的自定义可枚举类型作为参数(ASP.NET MVC)

时间:2012-07-28 19:46:52

标签: c# asp.net-mvc controller

我在ASP.NET MVC项目上工作,该项目需要能够以可扩展的方式过滤数据。我已决定使用一个类来表示单个过滤条件(我知道此时它可能是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)调用此方法,并返回包含一组实体的JSON,然后这些实体将显示在页面上。

我假设我需要某种转换器来接受原始状态中的参数,并创建实现IEnumerable<FilterCriterion>的可枚举对象。也许我可以使用ModelBinder,但我不确定如何。

你能把我推向正确的方向吗?感谢。

编辑: 我不按照建议传递数组。 当我进入控制器时,filters内的项目数量正确,但其属性(FilterName和FilterValue)都为空。下面我在客户端发布完整的代码以及filter对象的内容。我究竟做错了什么? 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"

2 个答案:

答案 0 :(得分: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轻松完成)

  3. 有一点需要注意:您的索引编号应该是连续的,即没有间隙。

    更新主题启动器更新:您必须非常小心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);
            });
    }
    

答案 1 :(得分:2)

请参阅此link,在这里您可以看到插件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);
}

根据回复:link