Насколько я могу найти на форумах Telerik, это невозможно сделать таким образом. Там был похожий вопрос, который описал точно такую же проблему. При передаче модели она всегда была нулевой в методе действия контроллера.
Однако существует обходной путь, если вы хотите передать несколько параметров методу select для фильтрации данных, но это требует некоторого кодирования на стороне клиента.
Я включу краткое изложение этой работы здесь, так что ответ будет полным. Торжественная ссылка мало что говорит.
Предположим, у нас есть сетка, которая отображает элементы заказов (статьи) из всех заказов. Сначала убедитесь, что подключено событие onDataBinding на стороне клиента:
<%= Html.Telerik().Grid<Order>()
.Name("Grid")
.ClientEvents(events => events.OnDataBinding("onDataBinding"))
.DataBinding(dataBinding => dataBinding.Ajax()
.Select("_AjaxBinding", "Grid"))
%>
В обработчике событий на стороне клиента вам нужно составить выбранный вами URL. Здесь я передам два параметра, идентификатор заказа (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) также возможна. Предположим, вам нужна коллекция идентификаторов заказов вместо одного.
Модель будет выглядеть так:
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