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

5
我将使用Telerik MVC Grid进行Ajax绑定,并且在传递用于过滤数据的对象时遇到了问题。我可以传递简单数据(字符串、整数),但不能传递更复杂的对象。
例如,我可以轻松地执行以下操作:
.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。

提前感谢您的任何想法!

2个回答

19
据我在Telerik论坛上的了解,似乎无法以这种方式实现。该论坛中有一个类似的问题,描述了完全相同的问题。将模型传递给控制器的操作方法时,模型始终为空。
但是,如果您想向选择方法传递多个参数以过滤数据,则可以使用一些客户端编程来解决此问题。
我将在此处包含该解决方法的摘要,以使答案更全面。单独的链接并没有太大作用。
假设我们有一个网格,显示所有订单的订单项(文章)。首先确保连接客户端的onDataBinding事件:
<%= Html.Telerik().Grid<Order>()
        .Name("Grid")
        .ClientEvents(events => events.OnDataBinding("onDataBinding"))
        .DataBinding(dataBinding => dataBinding.Ajax()
                                               .Select("_AjaxBinding", "Grid"))
%>

在客户端事件处理程序中,您需要组合选择URL。这里我将传递两个参数,一个订单ID(整数)和一篇文章的描述(字符串)。

<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的集合而不仅仅是一个。

模型应该是这样的:

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 论坛主题: 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

这对我来说已经完成了85%。假设我想传递一个List<int> OrderIds而不是int OrderID,你能看到如何做吗?我不能。非常感谢迄今为止的帮助!我尝试过 { "OrderIds" : [1, 2, 3] },但我的模型始终为空(似乎没有传递给控制器)。 - MattW
@MattW:已更新文章。现在包含将整数数组绑定到IEnumerable的示例。 - Christophe Geers
那太完美了。我不知道jQuery.ajaxSettings.traditional设置,这正是我的问题所在。感谢您的帮助!!! - MattW

1
此外需要注意的是,这个解决方案不是使用 Razor 语法...花了我很长时间才发现问题在于这一行代码:
var selectUrl = "<%= @Url.Action("_AjaxFilterBinding", "Home") %>" + "?" + paramsStr;
应该改为
var selectUrl = "@Url.Action("_AjaxFilterBinding", "Home")" + "?" + paramsStr;
对于 Razor...我复制了代码但是无法弄清楚为什么我的 _AjaxFilterBinding 没有被调用。只是想指出这个问题以防别人也遇到同样的问题。
感谢您提供的解决方案,现在它工作得很好 :)

是的,如果我的记忆没有出错的话,当时我使用的是ASP.NET MVC 2,所以没有Razor :( - Christophe Geers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接