我在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"
答案 0 :(得分:3)
将控制器签名更改为
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);
});
}
答案 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