如何将对象发送到Telerik MVC Grid Ajax Select()控制器方法

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论坛帖子:

http://www.telerik.com/community/forums/aspnet-mvc/grid/getting-the-model-object-in-a-custom-binding-grid-ajax-controller.aspx

建议的工作:

http://www.telerik.com/community/forums/aspnet-mvc/grid/code-sample-sending-additional-filters-with-ajax-binding.aspx