c# - Controller 中的自定义枚举类型作为参数 (ASP.NET MVC)

标签 c# asp.net-mvc controller

我从事一个 ASP.NET MVC 项目,该项目需要能够以可扩展的方式过滤数据。我决定使用一个类来表示单个过滤条件(我知道此时它可能是 Dictionary,但稍后我可能需要添加其他属性):

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

    public string FilterValue { get; set; }
}

这是我想到的 Controller 方法签名,它将返回过滤后的数据:

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

将从网页(使用 JavaScript)调用此方法,并将返回一个包含一组实体的 JSON,然后这些实体将显示在页面上。

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

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

编辑: 我没有按照建议传递数组。 当我进入 Controller 时,里面有正确数量的项目 filters ,但它们的属性(FilterName 和 FilterValue)均为 null。下面我发布完整的代码以及客户端过滤器对象的内容。我究竟做错了什么? JavaScript 代码:

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"

最佳答案

  1. 将您的 Controller 签名更改为

    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 轻松做到这一点)

一个警告:您的索引编号应该是连续的,即没有间隙。

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

关于c# - Controller 中的自定义枚举类型作为参数 (ASP.NET MVC),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11704125/

相关文章:

c# - 如何在多个位置定义路线?

c# - VS2017 - C#7 语言功能在 MVC View 中不起作用

php - cakephp foreach循环只显示标题的第一个字母

ruby-on-rails - rails : Pass Parameters to New Controller during 'redirect_to'

ruby-on-rails - Rails link_to 从 Controller 操作更新属性

c# - 获取两个值之间的 n 个不同的随机数,其总和等于给定数

c# - Directory.GetFiles 不返回文件

c# - 如何将数据作为参数绑定(bind)到 ActionLink?

c# - 正则表达式 OR (|) 是如何工作的?

c# - 如何更改计划任务的内存优先级?