#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
для обеспечения сортировки и разбиения на страницы.