Я хочу добавить фильтр выпадающего меню для представления, которое содержит клиентов и проекты. Мой фильтр работает с одним представлением модели (Project), но я не знаю, как применить его к моему действию OnGet, чтобы результирующее представление фильтровалось по подмодели (Project).
У меня естьдобавил код фильтра в действие OnGet для модели Project, но не знаю, куда включить переменную, которая будет обрабатывать фильтр поиска.
Файл Index.cshtml.cs (для примененияфильтр, когда пользователь нажимает кнопку «Поиск»)
[BindProperty]
public List<ClientVM> ClientVMList { get; set; }
//added for filter - start
public string CurrentFilter { get; set; }
//added for filter - end
//added for filter - string searchString
public async Task<IActionResult> OnGet(string searchString)
{
//added for filter - start
CurrentFilter = searchString;
IQueryable<Project> dsmIQ = from s in _context.Project
select s;
if (!String.IsNullOrEmpty(searchString))
{
dsmIQ = dsmIQ.Where(s => s.DSM.Contains(searchString));
}
//added for filter - end
var clientlist = _context.Client
.Include(c => c.ClientComments)
.Include(p => p.Projects)
.ThenInclude(pc => pc.ProjectComments).ToList();
ClientVMList = new List<ClientVM>();
foreach (var item in clientlist)
{
ClientVM clientVM = new ClientVM()
{
Projectlist = new List<ProjectVM>(),
};
clientVM.ClientName = item.ClientName;
if (item.ClientComments != null && item.ClientComments.Any())
{
clientVM.ClientStatusComment = item.ClientComments.OrderByDescending(cc => cc.LastUpdateDate).First().ClientStatusComment;
clientVM.ClientRAG = item.ClientComments.OrderByDescending(cc => cc.LastUpdateDate).First().ClientRAG;
clientVM.ClientStatusCommentId = item.ClientComments.OrderByDescending(cc => cc.LastUpdateDate).First().Id;
}
else
{
clientVM.ClientStatusComment = "No Status Comment";
}
foreach (var projectItem in item.Projects)
{
ProjectVM projectVM = new ProjectVM
{
ProjectPID = projectItem.PID,
ProjectName = projectItem.ProjectName,
ProjectStatusName = projectItem.ProjectStatus,
ForecastOwnerLongName = projectItem.ForecastOwner,
DSMLongName = projectItem.DSM,
};
if (projectItem.ProjectComments != null && projectItem.ProjectComments.Any())
{
projectVM.ProjectStatusComment = projectItem.ProjectComments.OrderByDescending(pc => pc.LastUpdateDate).First().ProjectStatusComment;
projectVM.RAGStatusName = projectItem.ProjectComments.OrderByDescending(pc => pc.LastUpdateDate).First().ProjectRAG;
projectVM.ProjectStatusCommentId = projectItem.ProjectComments.OrderByDescending(pc => pc.LastUpdateDate).First().Id;
}
else
{
projectVM.ProjectStatusComment = "No Status Comment";
}
clientVM.Projectlist.Add(projectVM);
}
ClientVMList.Add(clientVM);
}
return Page();
Рабочий код для отдельной модели (Project)
public IList<Project> Project { get;set; }
//added for filter - start
public string CurrentFilter { get; set; }
//added for filter - end
//added for filter - string searchString
public async Task OnGetAsync(string searchString)
{
//added for filter - start
CurrentFilter = searchString;
IQueryable<Project> dsmIQ = from s in _context.Project
.Include(p => p.Client)
select s;
if (!String.IsNullOrEmpty(searchString))
{
dsmIQ = dsmIQ.Where(s => s.DSM.Contains(searchString));
}
Project = await dsmIQ.AsNoTracking().ToListAsync();
//added for filter - end
// Project = await _context.Project
// .Include(p => p.Client).ToListAsync();
}
}
}
Код на странице Index.cshtml:
<form asp-page="./Index" method="get">
<div class="form-actions no-color">
<p>
My projects only:
<input type="text" name="SearchString" value="@Model.CurrentFilter" />
<input type="submit" value="Search" class="btn btn-primary" /> |
<a asp-page="./CommentGroupings/Index">Back to full List</a>
</p>
</div>
</form>
My View перечисляет все проекты Клиента с соответствующими комментариями. Я хочу, чтобы пользователь мог искать все проекты, в которых содержится его имя (поле DSM). Как я могу включить IQueryable<Project> dsmIQ = from s in _context.Project
в .Include(p => p.Projects)
моего var clientlist = _context.Client
?