Как отправить объект в Telerik MVC Grid Ajax Select () метод контроллера - PullRequest
5 голосов
/ 15 сентября 2011

Я использую Telerik MVC Grid с привязкой Ajax, и у меня возникла проблема при передаче объекта в контроллер, который будет использоваться для фильтрации данных. Я могу передавать простые данные (string, int), но не более сложный объект.

Например, я могу с этим без проблем:

.DataBinding(dataBinding => dataBinding.Ajax().Select("_CasesAjaxBinding", "Home", new {orderId = "12345"} ))

А затем в моем контроллере обработайте заказ следующим образом:

public ActionResult _CasesAjaxBinding(string orderId)

Проблема, с которой я сталкиваюсь, заключается в том, что я пытаюсь передать более сложный объект (в данном случае @Model) в контроллер, например так (@Model имеет тип CaseFilterModel):

.DataBinding(dataBinding => dataBinding.Ajax().Select("_CasesAjaxBinding", "Home", new {filterSpec = @Model} ))

И затем пытается обработать объект, как это:

public ActionResult _CasesAjaxBinding(CaseFilterModel filterSpec)

Параметр filterSpec всегда равен нулю.

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

Ответы [ 2 ]

19 голосов
/ 15 сентября 2011

Насколько я могу найти на форумах 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

1 голос
/ 19 апреля 2013

Также, как примечание, это решение не в синтаксисе Razor ... мне потребовалось целую вечность, чтобы найти его, но строку

var selectUrl = "<% = @ Url.Action (" _ AjaxFilterBinding ","Главная ")%>" + "?"+ paramsStr;

следует изменить на
var selectUrl = "@ Url.Action (" _ AjaxFilterBinding "," Home ")" + "?"+ paramsStr;

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

Спасибо за решение, оно СЕЙЧАС прекрасно работает:)

...