如何在ASP.NET MVC中将Kendo网格过滤器发送到操作?
我使用这种结构并且它正在工作,但我无法在控制器中获得发送值。参数"模型"在行动中是空的。
$('#btn-print').click(function () {
filter = $('#trips').data('kendoGrid').dataSource.filter();
$.ajax({
type: 'post',
url: '@Url.Action("Print", "Trips")',
//dataType: 'json',
data: filter,
success: function (d) {
var win = window.open('about:blank');
with (win.document) {
open();
write(d);
close();
}
//alert('print click.');
}
})
});
ASP.NET动作
[HttpPost]
public ActionResult Print(object model)
{
var r = Request;
return View();
}
谢谢。 :)
答案 0 :(得分:0)
你的方法对我来说有点令人惊讶。为什么不创建
var customDS = new kendo.data.dataSource(
transport:
{
read:
{
url: '@Url.Action("Print","Trips")',
dataType: 'aspnetmvc-ajax'
}
},
requestEnd: function (d) {
var win = window.open('about:blank');
with (win.document) {
open();
write(d);
close();
}
});)
并简单地复制过滤器?
if ($('#trips').data('kendoGrid').dataSource.filter())
{
// if no filters are applied .filter() might return undefined, so to prevent
// errors lets check if any filters are applied
var filters = $('#trips').data('kendoGrid').dataSource.filter().filters;
customDS.filter(filters);
}
然后继续进行旅行网格。 请注意,dataType不是json。
但是,如果你必须在不使用dataSource和json的情况下完成它,那么它将变得更加困难。 dataSource.filter()
返回由'filters'数组和'logic'组成的对象。过滤器中的每个元素都是由“字段”,“值”和“运算符”组成的对象。目前你的参数'model'是空的只是因为你没有发送任何由'model'这个名字定义的东西。实际上,您的数据如下所示:
data: { filters: [somearray], logic: 'somelogic' }
如果你想把它作为json传递,你在控制器中的参数应该反映你真正发送的是什么(或者你可以绑定前缀),以便反序列化可以发挥它的魔力。 所以它要么
data: {model : filter}
或
public ActionResult Print(Filters filters, string logic)
其中Filters是一个具有3个字段的类,与客户端dataSource.filter().filters
数组相同。
因为其中一个字段是“运算符”,即AFAIR C#限制关键字,您还必须将所有数据从“过滤器”移动到某些“temporaryFilters:{field:'',value:'',_ operator: ''}。这是太多的工作,所以放弃该解决方案并使用dataSource:)