我从事一个 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"
最佳答案
将您的 Controller 签名更改为
public JsonResult GetMultipleShowDetailsByFilter(FilterCriterion[] filters, int pageNumber, int itemsPerPage)
使用以下
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/