Mat*_*ttW 5 c# asp.net-mvc telerik-mvc
我使用带有Ajax绑定的Telerik MVC Grid,并且在将对象传递给控制器以用于过滤数据时遇到问题.我能够传递简单数据(string,int),但不能传递更复杂的对象.
例如,我可以这样没问题:
.DataBinding(dataBinding => dataBinding.Ajax().Select("_CasesAjaxBinding", "Home", new {orderId = "12345"} ))
Run Code Online (Sandbox Code Playgroud)
然后在我的控制器中,像这样处理orderId:
public ActionResult _CasesAjaxBinding(string orderId)
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是当我尝试将更复杂的对象(在本例中为@Model)传递给控制器时,就像这样(@Model是类型CaseFilterModel):
.DataBinding(dataBinding => dataBinding.Ajax().Select("_CasesAjaxBinding", "Home", new {filterSpec = @Model} ))
Run Code Online (Sandbox Code Playgroud)
然后尝试处理对象,如下所示:
public ActionResult _CasesAjaxBinding(CaseFilterModel filterSpec)
Run Code Online (Sandbox Code Playgroud)
filterSpec参数始终为null.
提前感谢任何想法!
Chr*_*ers 19
据我所知,在Telerik论坛上,这不可能做到这一点.那里有一个类似的问题,它描述了完全相同的问题.传递模型时,它在控制器的action方法中始终为null.
但是,如果要将多个参数传递给select方法以过滤数据,则需要一种解决方法,但它需要一些客户端编码.
我将在此处包含该工作的摘要,以便答案完整.庄严的联系并没有多说.
假设我们有一个网格,显示所有订单中的订单商品(商品).首先确保连接客户端onDataBinding事件:
<%= Html.Telerik().Grid<Order>()
.Name("Grid")
.ClientEvents(events => events.OnDataBinding("onDataBinding"))
.DataBinding(dataBinding => dataBinding.Ajax()
.Select("_AjaxBinding", "Grid"))
%>
Run Code Online (Sandbox Code Playgroud)
在客户端事件处理程序中,您需要编写选择的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>
Run Code Online (Sandbox Code Playgroud)
然后在您的控制器中,您可以声明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 });
}
Run Code Online (Sandbox Code Playgroud)
该模型看起来像:
public class AjaxFilterBindingModel
{
public int OrderId { get; set; }
public string ArticleDescription { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
也可以通过URL(GET)传递集合.假设您需要一组订单ID而不是一个订单ID.
该模型如下所示:
public class AjaxFilterBindingModel
{
public IEnumerable<int> OrderIds { get; set; }
public string ArticleDescription { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
备注:不要忘记设置"jQuery.ajaxSettings.traditional = true;" 或者参数将被错误地序列化,并且ASP.NET MVC模型绑定器将无法绑定整数数组.
在这里完成的是我提到的Telerik论坛帖子:
建议的工作: