Разбитый на страницы список с несколькими полями поиска на страницах RazorC#

Место общения программистов C#
Ответить
Anonymous
 Разбитый на страницы список с несколькими полями поиска на страницах Razor

Сообщение Anonymous »

Я создаю приложение Razor Page, в котором моим клиентам необходимо выполнять поиск по нескольким полям одновременно, однако, когда я создаю несколько полей поиска, сам поиск работает хорошо, но разбиение на страницы в разбитом на страницы списке прерывается, теряя условия поиска на второй странице и возвращаясь к порядку разбиения на страницы по умолчанию. Есть ли другой тип списка, который мне следует реализовать, или есть ли способ условно определить приоритетность того, какое поле поиска использует список с разбивкой на страницы, чтобы поддерживать порядок нумерации страниц и не потерять поиск? Как новичок в разработке, я предоставлю большую часть кода в исходном коде, так как мне до сих пор неясно, как все эти части сочетаются друг с другом, когда дело доходит до разбивки на страницы, сортировки и фильтрации в Razor Pages.

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

Это код:

Код: Выделить всё

 private readonly PFDTrustContext _context;

public IndexModel(PFDTrustContext context)
{
_context = context;
}

public PaginatedList Clients { get; set; }

// sorting
public string AcctNumberSort { get; set; }
public string FirstNameSort { get; set; }
public string LastNameSort { get; set; }
public string SSNSort { get; set; }
public string CurrentSort { get; set; }

// filtering
public string FilterLN { get; set; }
public string FilterFN { get; set; }
public string FilterSSN { get; set; }
public string FilterAcctNum { get; set; }
public string CurrentFilter { get; set; }

public async Task OnGetAsync(string sortOrder, string searchStringLN, string searchStringFN, string searchStringSSN, string searchStringAcctNum, string filterLN, string filterFN, string filterSSN, string filterAcctNum, string currentFilter, int? pageIndex)
{
CurrentSort = sortOrder;

// Sorting
LastNameSort = string.IsNullOrEmpty(sortOrder) ? "lastName_desc" : "";
FirstNameSort = sortOrder == "firstName" ? "firstName_desc" : "firstName";
AcctNumberSort = sortOrder == "acctNumber" ? "acctNumber_desc" : "acctNumber";
SSNSort = sortOrder == "SSN" ? "SSN_desc" : "SSN";

// Paging
if (searchStringLN != null)
{
pageIndex = 1;
}
else
{
searchStringLN = filterLN;
}

if (searchStringFN != null)
{
pageIndex = 1;
}
else
{
searchStringFN = filterFN;
}

if (searchStringSSN != null)
{
pageIndex = 1;
}
else
{
searchStringSSN = filterSSN;
}

if (searchStringAcctNum != null)
{
pageIndex = 1;
}
else
{
searchStringAcctNum = filterAcctNum;
}

// Searching/Filtering
FilterLN = searchStringLN;
FilterFN = searchStringFN;
FilterSSN = searchStringSSN;
FilterAcctNum = searchStringAcctNum;

if (!string.IsNullOrEmpty(FilterLN))
{
CurrentFilter = FilterLN;
}
else if (!string.IsNullOrEmpty(FilterSSN))
{
CurrentFilter = FilterSSN;
}
else if (!string.IsNullOrEmpty(FilterAcctNum))
{
CurrentFilter = FilterAcctNum;
}
else
{
CurrentFilter = FilterFN;
}

// Sorting
IQueryable clients = from c in _context.Clients
select c;

// Searching
if (!string.IsNullOrEmpty(searchStringLN))
{
clients = clients.Where(c => c.LastName.ToUpper().Contains(searchStringLN.ToUpper()));
}
if (!string.IsNullOrEmpty(searchStringFN))
{
clients = clients.Where(c => c.FirstName.ToUpper().Contains(searchStringFN.ToUpper()));
}
if (!string.IsNullOrEmpty(searchStringSSN))
{
clients = clients.Where(c => c.SSN.ToString().Contains(searchStringSSN));
}
if (!string.IsNullOrEmpty(searchStringAcctNum))
{
clients = clients.Where(c => c.AcctNumber.ToString().Contains(searchStringAcctNum));
}

// Sorting
switch (sortOrder)
{
case "lastName_desc":
clients = clients.OrderByDescending(c =>  c.LastName);
break;
case "acctNumber":
clients = clients.OrderBy(c => c.AcctNumber);
break;
case "acctNumber_desc":
clients = clients.OrderByDescending(c => c.AcctNumber);
break;
case "firstName_desc":
clients = clients.OrderByDescending(c => c.FirstName);
break;
case "firstName":
clients = clients.OrderBy(c => c.FirstName);
break;
case "SSN":
clients = clients.OrderBy(c => c.SSN);
break;
case "SSN_desc":
clients = clients.OrderByDescending(c => c.SSN);
break;
default:
clients = clients.OrderBy(c => c.LastName);
break;
}

// Pagination
int pageSize = 12;

Clients = await PaginatedList.CreateAsync(
clients.AsNoTracking(), pageIndex ?? 1, pageSize);
}
Это страница Razor:

Код: Выделить всё

 



@Html.DisplayNameFor(model => model.Clients[0].ClientId)



@Html.DisplayNameFor(model => model.Clients[0].AcctNumber)




@Html.DisplayNameFor(model => model.Clients[0].FirstName)




@Html.DisplayNameFor(model => model.Clients[0].LastName)



@Html.DisplayNameFor(model => model.Clients[0].MdlInit)



@Html.DisplayNameFor(model => model.Clients[0].SSN)



@Html.DisplayNameFor(model => model.Clients[0].DOB)


@Html.DisplayNameFor(model => model.Clients[0].InitialEntryDate)





@foreach (var item in Model.Clients)
{


@Html.DisplayFor(modelItem => item.ClientId)


@Html.DisplayFor(modelItem => item.AcctNumber)


@Html.DisplayFor(modelItem => item.FirstName)


@Html.DisplayFor(modelItem => item.LastName)


@Html.DisplayFor(modelItem => item.MdlInit)


@Html.DisplayFor(modelItem => item.SSN, "SSN")


@Html.DisplayFor(modelItem => item.DOB)


@Html.DisplayFor(modelItem => item.InitialEntryDate)


Edit Client  |
Transactions


}



@{
var prevDisabled = !Model.Clients.HasPreviousPage ? "disabled" : "";
var nextDisabled = !Model.Clients.HasNextPage ? "disabled" : "";
}


Previous



Next

В конечном итоге мне нужна нумерация страниц, чтобы сохранить условия поиска и порядок сортировки при перемещении по страницам результатов. Если это просто невозможно, то я хотел бы знать, как устранить нумерацию страниц и использовать какой-либо другой тип коллекции, чтобы сохранить возможность одновременного поиска по нескольким полям.

Подробнее здесь: https://stackoverflow.com/questions/585 ... azor-pages
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»