我正在使用带有Ajax绑定的Telerik MVC Grid,并且在将对象传递给控制器以用于过滤数据时遇到问题。我能够传递简单数据(string,int),但不能传递更复杂的对象。
例如,我可以解决这个问题:
.DataBinding(dataBinding => dataBinding.Ajax().Select("_CasesAjaxBinding", "Home", new {orderId = "12345"} ))
然后在我的控制器中,像这样处理orderId:
public ActionResult _CasesAjaxBinding(string orderId)
我遇到的问题是当我尝试将更复杂的对象(在本例中为@Model)传递给控制器时,就像这样(@Model是CaseFilterModel类型):
.DataBinding(dataBinding => dataBinding.Ajax().Select("_CasesAjaxBinding", "Home", new {filterSpec = @Model} ))
然后尝试处理对象,如下所示:
public ActionResult _CasesAjaxBinding(CaseFilterModel filterSpec)
filterSpec参数始终为null。
提前感谢任何想法!
答案 0 :(得分:19)
据我所知,在Telerik论坛上,这种方式无法做到。那里有一个类似的问题,它描述了完全相同的问题。传递模型时,它在控制器的操作方法中始终为null。
但是,如果要将多个参数传递给select方法以过滤数据,则需要一种解决方法,但它需要一些客户端编码。
我将在此处包含该工作的摘要,以便答案完整。庄严的联系并没有多说。
假设我们有一个网格,显示所有订单中的订单商品(商品)。首先确保连接客户端onDataBinding事件:
<%= Html.Telerik().Grid<Order>()
.Name("Grid")
.ClientEvents(events => events.OnDataBinding("onDataBinding"))
.DataBinding(dataBinding => dataBinding.Ajax()
.Select("_AjaxBinding", "Grid"))
%>
在客户端事件处理程序中,您需要编写选择的URL。在这里,我将传递两个参数,一个订单ID(int)和一篇文章的描述(字符串)。
<script type="text/javascript">
function onDataBinding(e) {
var orderId = 100;
var searchText = "test";
var params = { OrderId: orderId, ArticleDescription: searchText };
var paramsStr = $.param(params);
var selectUrl = "<%= @Url.Action("_AjaxFilterBinding", "Grid") %>"
+ "?" + paramsStr;
var grid = $('#Grid').data('tGrid');
grid.ajax.selectUrl = selectUrl;
}
</script>
然后在您的控制器中,您可以按如下方式声明select方法:
[GridAction]
public ActionResult _AjaxFilterBinding(AjaxFilterBindingModel model)
{
// Retrieve data here and filter it based upon the data present in the model.
var data = ...;
return View(new GridModel<Order> { Data = data });
}
模型如下:
public class AjaxFilterBindingModel
{
public int OrderId { get; set; }
public string ArticleDescription { get; set; }
}
也可以通过URL(GET)传递集合。假设您需要一组订单ID而不是一个订单ID。
模型看起来像这样:
public class AjaxFilterBindingModel
{
public IEnumerable<int> OrderIds { get; set; }
public string ArticleDescription { get; set; }
}
JavaScript看起来像这样:
function onDataBinding(e) {
jQuery.ajaxSettings.traditional = true;
var intArray = [1, 2, 3, 4, 5];
var params = { OrderIds: intArray, ArticleDescription: "Test" };
var paramsStr = $.param(params);
var selectUrl = "<%= @Url.Action("_AjaxFilterBinding", "Home") %>" + "?"
+ paramsStr;
var grid = $('#Grid').data('tGrid');
grid.ajax.selectUrl = selectUrl;
}
备注:不要忘记设置“jQuery.ajaxSettings.traditional = true;”或者参数将被错误地序列化,并且ASP.NET MVC模型绑定器将无法绑定整数数组。
在这里完成的是我提到的Telerik论坛帖:
建议的工作:
答案 1 :(得分:1)
另外作为一个注释,这个解决方案不是Razor语法...带我永远发现它但是行
var selectUrl =“&lt;%= @ Url.Action(”_ AjaxFilterBinding“,”Home“)%&gt;” +“?” + paramsStr;
应更改为
var selectUrl =“@ Url.Action(”_ AjaxFilterBinding“,”Home“)”+“?” + paramsStr;
对于Razor ...我复制了代码,但无法弄清楚为什么我的_AjaxFilterBinding没有被调用。只是想我会指出它,以防其他人有这个问题。
感谢您的解决方案,它现在很有效:)