Как реализовать поиск в DataTable (Учебник по разработке веб-приложений)

#asp.net-mvc #asp.net-core #abp

Вопрос:

Я абсолютно новичок в ABP-фреймворке. Я следовал «Учебнику по разработке веб-приложений». Теперь я хочу использовать поиск в таблице данных. В файле «Index.js» Я установил «поиск» на «истину», но ничего не происходит.

 var dataTable = $('#WordsTable').DataTable(
   abp.libs.datatables.normalizeConfiguration({
   serverSide: true,
   paging: true,
   order: [[1, "asc"]],
   searching: true,
   scrollX: true,
   ...
 

Как можно реализовать поиск?
С уважением, Том

Ответ №1:

Если вы установили searching:true для своей таблицы данных, она выполняет поиск только по текущим значениям страницы по строкам. (https://datatables.net/reference/option/searching)

Итак, если вы хотите искать записи в соответствии со всеми вашими записями, вам нужно добавить поисковый ввод в файл .cshtml, получить значение этого поискового ввода и передать это значение методу getList(конечно, вам также нужно переопределить метод getList из YourAppService).

Шаги:

  • Создайте новый DTO

MySearchFilterDto.cs -> (в разделе Контракты приложений)

 public class MySearchFilterDto : PagedAndSortedResultRequestDto
{
   public string Filter { get; set; }
}
 
  • Измените IBookAppService и BookAppService

IBookAppService.cs

 public interface IBookAppService :
        ICrudAppService< 
            BookDto, 
            Guid, 
            MySearchFilterDto, //Used for paging/sorting   filtering (we've defined)
            CreateUpdateBookDto> 
    {

    }
 

Обратите внимание, мы изменились PagedAndSortedResultRequestDto на MySearchFilterDto .

BookAppService.cs

 public class BookAppService :
        CrudAppService<
            Book, 
            BookDto,
            Guid, 
            MySearchFilterDto, //Used for paging/sorting   filtering (we've defined)
            CreateUpdateBookDto>, 
        IBookAppService 
    {
        public BookAppService(IRepository<Book, Guid> repository)
            : base(repository)
        {

        }

        //override the GetList method to enable searching (in here I only search by book name, you can also search by other props)
        public override async Task<PagedResultDto<BookDto>> GetListAsync(MySearchFilterDto input)
        {
            var queryable = await base.Repository.GetQueryableAsync();
            var query = queryable.WhereIf(!string.IsNullOrWhiteSpace(input.Filter), book => book.Name.ToLower()
                .Contains(input.Filter.ToLower()))
                .OrderBy(input.Sorting ?? nameof(Book.Name).ToLower())
                .PageBy(input);


            var count = await AsyncExecuter.CountAsync(query);
            var books = await AsyncExecuter.ToListAsync(query);

            var result = ObjectMapper.Map<List<Book>, List<BookDto>>(books);

            return new PagedResultDto<BookDto> { Items = result, TotalCount = count };
        }
    }
 
  • Откройте свой Index.cshtml (в разделе Страницы -> Книги) и добавьте ввод для поиска.

Индекс.cshtml

 //...

<abp-card>
    <abp-card-header>
        <h2>@L["Books"]</h2>
    </abp-card-header>
    <abp-card-body>
        <abp-column size="_3">
           Search: 
            <input name="Search" /> @* add search input *@
        </abp-column>
        <abp-table striped-rows="true" id="BooksTable"></abp-table>
    </abp-card-body>
</abp-card>
 
  • Откройте свой Index.js (в разделе Страницы -> Книги), получите значение ввода поиска и передайте его методу getList.

Index.js

 $(function () {

   //get the value of the search input
    var getFilter = function () {
        return {
            filter: $("input[name='Search'").val(),
        };
    };

    var dataTable = $('#BooksTable').DataTable(
        abp.libs.datatables.normalizeConfiguration({
            serverSide: true,
            paging: true,
            order: [[1, "asc"]],
            searching: false,
            scrollX: true,
            ajax: abp.libs.datatables.createAjax(myDemoTest4421.books.book.getList, getFilter), //pass the filter to the GetList method
            columnDefs: [
                {
                    title: 'Name',
                    data: "name"
                },
                {
                    title: 'Type',
                    data: "type",
                    render: function (data) {
                        return data;
                    }
                },
                {
                    title: 'PublishDate',
                    data: "publishDate",
                    render: function (data) {
                        return luxon
                            .DateTime
                            .fromISO(data, {
                                locale: abp.localization.currentCulture.name
                            }).toLocaleString();
                    }
                },
                {
                    title: 'Price',
                    data: "price"
                },
                {
                    title: 'CreationTime', data: "creationTime",
                    render: function (data) {
                        return luxon
                            .DateTime
                            .fromISO(data, {
                                locale: abp.localization.currentCulture.name
                            }).toLocaleString(luxon.DateTime.DATETIME_SHORT);
                    }
                }
            ]
        })
    );
   
   //when search input changed (a new character typed) reload the datatable
   $("input[name='Search'").change(function () {
        dataTable.ajax.reload();
    });
});

 

Выполнив эти действия, вы сможете искать свои книги по названию.

введите описание изображения здесь

Комментарии:

1. Большое спасибо за ваш подробный ответ! Это именно то, на что я надеялся. Я попробую как можно скорее. С уважением, Том

2. Это отлично работает. Еще раз спасибо! Я просто использую «ввод» вместо «изменение».

3. Пожалуйста.

4. С этим решением есть 2 проблемы: 1.) Подкачка больше не работает. 2.) Сортировка по щелчку по заголовкам столбцов не работает. Не могли бы вы, пожалуйста, помочь с их исправлением? @engincan-веске

5. @Metal-Frog, я обновил вопрос. Вы можете использовать методы OrderBy и PageBy для обеспечения сортировки и разбиения на страницы.