Способ, как передать объект из 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.



Заранее спасибо за любые идеи!

733   2  

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, которую я упомянул:

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

Также в качестве примечания, это решение не находится в синтаксисе Razor... мне потребовалась вечность, чтобы заметить это, но линия

Var selectUrl = " "+"?"+ paramsStr;

Следует заменить на
var selectUrl = " @Url.Действие ("_AjaxFilterBinding", "Home")"+"?"+ paramsStr;

Для Бритвы... Я скопировал код, но не мог понять, почему моя _AjaxFilterBinding не вызывается. Просто подумал, что я должен указать на это, если у кого-то еще есть это проблема.

Спасибо за решение, теперь оно отлично работает :)

Comments

    Ничего не найдено.