Способ, как передать объект из Telerik MVC на сетке Аякс выберите (контроллер)
Я использую сетку Telerik MVC с привязкой Ajax, и у меня возникла проблема с передачей объекта контроллеру, который будет использоваться для фильтрации данных. Я могу передавать простые данные (string, int), но не более сложный объект.
Например, я могу к этому без проблем:
.DataBinding(dataBinding => dataBinding.Ajax().Select("_CasesAjaxBinding", "Home", new {orderId = "12345"} ))
А затем в моем контроллере обработайте orderId следующим образом:
public ActionResult _CasesAjaxBinding(string orderId)
Проблема, с которой я сталкиваюсь, заключается в том, что я пытаюсь передать более сложный объект (в данном случае @Model) контроллеру, как это (The @Model-тип CaseFilterModel):
.DataBinding(dataBinding => dataBinding.Ajax().Select("_CasesAjaxBinding", "Home", new {filterSpec = @Model} ))
И затем пытается обработать объект, как это:
public ActionResult _CasesAjaxBinding(CaseFilterModel filterSpec)
Параметр filterSpec всегда равен null.
Заранее спасибо за любые идеи!
2 ответов:
Насколько я могу судить по форумам Телерика, это невозможно сделать таким образом. Там был похожий вопрос, который описывал точно такую же проблему. При передаче модели она всегда была нулевой в методе действия контроллера.
Однако существует обходной путь, если вы хотите передать несколько параметров в метод select для фильтрации данных, но это требует некоторого кодирования на стороне клиента.
Я включу краткое изложение этой работы здесь, так что ответ будет таким: полный. Торжественная связь мало что говорит.
Предположим, что у нас есть сетка, которая отображает элементы заказов (статьи) из всех заказов. Сначала убедитесь, что подключили событие onDataBinding на стороне клиента:<%= Html.Telerik().Grid<Order>() .Name("Grid") .ClientEvents(events => events.OnDataBinding("onDataBinding")) .DataBinding(dataBinding => dataBinding.Ajax() .Select("_AjaxBinding", "Grid")) %>В обработчике событий на стороне клиента вам нужно составить свой URL select. Здесь я передам два параметра, идентификатор заказа (int) и описание статьи (string).
<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.аджаксеттингс.traditional = true; " или параметры будут сериализованы неправильно, и ASP.NET MVC model binder не сможет связать массив целых чисел.
И чтобы быть полным, вот тема форума Telerik, которую я упомянул:
И предлагаемые обходные пути:
Также в качестве примечания, это решение не находится в синтаксисе Razor... мне потребовалась вечность, чтобы заметить это, но линия
Var selectUrl = " "+"?"+ paramsStr;
Следует заменить на
var selectUrl = " @Url.Действие ("_AjaxFilterBinding", "Home")"+"?"+ paramsStr;Для Бритвы... Я скопировал код, но не мог понять, почему моя _AjaxFilterBinding не вызывается. Просто подумал, что я должен указать на это, если у кого-то еще есть это проблема.
Спасибо за решение, теперь оно отлично работает :)
Comments