2014-07-03 1 views
1

Id хотел бы добавить кнопку, чтобы удалить все записи, на которые ссылаются в сетке с постраничной и фильтрованной сетью Kendo (все выгружаемые записи), которые сохраняются с помощью любых сетевых фильтровКак удалить все записи из сетки paged и фильтров Kendo (в контроллере)

Очевидно расширения Telerik MVC абстрагирует работу он делает с iqueryable на контроллере с использованием расширения ToDataSourceResult и параметра [DataSourceRequest] DataSourceRequest request

Таким образом, вопросы являются,

  • можно ли каким-то образом создать действие пользовательского контроллера и связанная с ними передним концом кода пройти нынешнему режим ФИЛЬТРАЦИИ
  • ли тогда возможно в действие, чтобы удалить все записи, связанные с этой фильтрацией

Ie. я мог бы иметь выгружаемую сетку с 1000 записями (10 на страницу), отфильтрованную productId, было бы неплохо создать пользовательскую кнопку на панели инструментов, называемую «удалить все», чтобы удалить все сопоставленные отфильтрованные записи

Обратите внимание, что на панели инструментов кнопку я могу сделать, но им не уверен, если Telerik позволяет иметь доступ к iqueriable и DataSourceRequest механизм таким образом, что может сделать это посильный

Указывая меня в правильном направлении было бы достаточно

Обновление

, так как я действительно имею дело с миллионами решений на стороне сервера, было бы предпочтительнее

ответ

1

Хорошо, я не знаю, есть ли лучше но я нашел это. Я не притворяюсь, что он совершенен.

Вы можете использовать эту идею с помощью настраиваемой кнопки и прикрепить к ней событие click. В обработчике событий click вы должны извлечь из источника данных необходимые вам (фильтры, сортировки и т. Д.). Все свойства класса DataSourceRequest можно извлечь из объекта JavaScript dataSourceo:

dataSource.sort() dataSource.filter(), dataSource.group(), 
dataSource.aggregate(), dataSource.page(), dataSource.pageSize() 

Вы должны извлечь их кендо конкретного метода, форматировать их в качестве форм-данных (JSON не работает в моем случае, я не знаю, почему :(), отправить их в контроллер через AJAX, в контроллере написать логику на стороне сервера на основе запроса DataSourceRequest

Сценарий:.

function deleteAllEventHandler(){ 
    var dataSource = $('#Grid').data('kendoGrid').dataSource; 

    var dataSourceRequest = dataSource.transport.parameterMap({ 
     sort: dataSource.sort(), 
     filter: dataSource.filter(), 
     group: dataSource.group(), 
     aggregate: dataSource.aggregate(), 
     page: dataSource.page(), 
     pageSize: dataSource.pageSize() 
    }); 

    var data = ""; 

    for (var key in dataSourceRequest) { 
     if (dataSourceRequest[key] !== undefined) { 
      data += key + "=" + dataSourceRequest[key] + "&"; 
     } 
    } 

    $.ajax({ 
     type: "POST", 
     contentType: "application/x-www-form-urlencoded; charset=UTF", 
     url: "@Html.Action("DeleteAllAction", "MyController")", 
     data: data, 
     success: function(){ 
      dataSource.read(); 
     } 
    }); 
} 

Контроллер:

public ActionResult DeleteAll([DataSourceRequest] DataSourceRequest request) 
{ 
    // Here you must parse the request to expression tree with custom logic 
    // or use the folliwng logic: 

    // It's very important to return IQueryable here so you can apply kendo 
    // filters without fetching all data from the dataprovider (sql server) 
    var items = YourDataProvider.GetQueryableItems(); 

    // Applying the kendo filters on your queryable. 
    // I don't know if there is a better way but I use this one. 
    var result = items.ToDataSourceResult(); 

    // Delete items 
    YourDataProivder.DeleteItems(result.Data); 

    // return Success 
    return new HttpStatusCodeResult(200); 
} 

Я все еще думаю, что на стороне клиента извлечения Идентификаторы и отправки только на сервер для удаления является лучшим решением, но не стесняйтесь использовать этот подход, если он подходит лучше в вашем случае или имеет более высокую производительность или т. д. Удачи.

+0

Wow спасибо снова, плохо попробуйте оба и отметьте соответственно –

1

Я не очень разбираюсь в оболочках kendo mvc, но в конце хелперы попадают в html и javascript. Вы можете написать пользовательскую логику JavaScript для такого поведения.

Если вы используете пейджинг на стороне сервера, сортируя, отфильтровываясь на стороне клиента, у вас есть только видимые элементы currenlty. Вы можете получить доступ к элементам данных в любое время, поэтому добавьте некоторую кнопку и прикрепите событие click. В случае, когда обработчик берет данные, получает идентификаторы и делает (ajax) вызов для некоторых действий, требующих коллекции идентификаторов и удаления элементов. После завершения ajax-вызова успешно вызывается dataSource.read();

Пример:

cshtml:

<button id="btnDelete">Delete all visible</button> 

@(Html.Kendo().Grid<MyModel>().Name("GridId")) 
// ... other grid settigns 

<script> 
    $('#btnDelete').on('click', function() { 
     // Add some js confirmation here. confirm(...) 

     // Get the grid and data for current page/filter/sort 
     // The data will contain only the currently visible items 
     var grid = $('#Grid').data('kendoGrid'); 
     var data = grid.dataSource.data(); 

     var ids = []; 
     for (var i = 0, len = data.length; i < len; i += 1) { 
      ids.push(data[i].Id); 
     } 

     // Ajax call to Action that gets collection of ids and deletes items 
     // On success call grid.dataSoruce.read(); 
    }); 
</script> 

Если вы не используете побочные действия сервера, возможно, вы можете получить доступ к идентификаторам с помощью JQuery селекторы.

$('#Grid tr[role=row] td[role=gridcell]:first-of-type') // if the id is the first td 

Надеется, что это помогает :)


EDIT:

Хорошо, если вы не используете на сторону сервера операции, которые вы можете использовать grid.dataSource.вид() // Возвращает текущие видимые элементы

На самом деле, если вы используете сторону сервера операции вы можете использовать вид() метод тоже вместо данных()

+0

Благодарим за информативный ответ. К сожалению, я имею дело с миллионами записей, поэтому все должно быть сделано на сервере, однако вы вдохновили меня на работу, если это необходимо, однако больно оставить это открытым, пока просто incase –

+0

IMO, это не так уж сложно перебирать элементы и выбирать их идентификаторы на стороне клиента (даже если они миллионы). Если вам нужна чистая серверная сторона, вы должны отправить все применяемые фильтры, сортировку, страницу, pageSize и т. Д. И проанализировать их на стороне сервера (я думаю, что это решение будет сложнее и хуже). Если вы решите пойти таким образом, вы можете получить доступ ко всему, что вам нужно, от объекта dataSource. Я напишу еще один ответ. –

Смежные вопросы