当 select 在下拉列表中输入多个条目时,多个 select 下拉菜单搜索字符串结果

Multiple select dropdown menu search string result when selecting more than one entry in the drop down

我构建了一个下拉菜单,其中的名称作为过滤器应用于 table 个项目。我希望能够从下拉列表中 select 多个条目并将它们应用为过滤器。单个条目过滤器工作正常,但多个 select 搜索过滤器不会 return 任何项目记录。当下拉菜单中没有 selected 时,也不会显示任何项目。当搜索过滤器为空时,如何修改我的搜索参数结果以显示所有项目,并在下拉菜单中显示分配给多人 selected 的项目。

我的项目class:

    public class Project
    {
        public int Id { get; set; }

        [Display(Name = "PID")]
        public int PID { get; set; }

        [Display(Name = "Name")]
        public string ProjectName { get; set; }

        [Display(Name = "Client")]
        public int ClientId { get; set; }
        public Client Client { get; set; }

        [Display(Name = "Status")]
        public string ProjectStatus { get; set; }

        [Display(Name = "Forecast Owner")]
        public string ForecastOwner { get; set; }

        [Display(Name = "DSM")]
        public string DSM { get; set; }
        public ICollection<ProjectComment> ProjectComments { get; set; }

我的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;
            //added for filter - end

                var clientlist = (await _context.Client
                .Include(cc => cc.ClientComments).ToListAsync());
            var projectlist = (await _context.Project
                .Include(pc => pc.ProjectComments)
                //added for filter - start
                .Where(s => s.DSM == (searchString))
                //added for filter - end 
                .ToListAsync());

            ClientVMList = new List<ClientVM>();

            foreach (var item in clientlist)
            {
                ClientVM clientVM = new ClientVM()
                {
                    Projectlist = new List<ProjectVM>(),
                };
                clientVM.ClientName = item.ClientName;
                clientVM.ClientId = item.Id;
                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.LastUpdateDate = item.ClientComments.OrderByDescending(cc => cc.LastUpdateDate).First().LastUpdateDate;
                    clientVM.ClientStatusCommentId = item.ClientComments.OrderByDescending(cc => cc.LastUpdateDate).First().Id;
                }
                else
                {
                    clientVM.ClientStatusComment = "No Status Comment";
                }
                foreach (var projectItem in projectlist)
                {
                    ProjectVM projectVM = new ProjectVM
                    {
                        ClientId = projectItem.ClientId,
                        ProjectId = projectItem.Id,
                        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.LastUpdateDate = projectItem.ProjectComments.OrderByDescending(pc => pc.LastUpdateDate).First().LastUpdateDate;
                        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();

我的表单标签Index.cshtml:

<form asp-page="./Index" method="get">
    <div class="dropdown">
            <div class="input-group mb-3">
                <div class="input-group-prepend">
                    <label class="input-group-text" for="inputGroupSelect01">DSM</label>
                </div>
                <select class="custom-select" id="inputGroupSelect01" multiple="multiple" name="SearchString" value="@Model.CurrentFilter">
                    <option selected>Choose a DSM...</option>
                    <option value="Anna">Anna</option>
                    <option value="Bernard">Bernard</option>
                    <option value="Carlo">Carlo</option>
                </select>
            </div>
            <input type="submit" value="Search" class="btn btn-primary" /> |
            <a asp-page="./CommentGroupings/Index">Back to full List</a>
        </p>
    </div>
</form>

URL中的搜索字符串结果:

https://localhost:44358/Lists?SearchString=Anna&SearchString=Bernard&SearchString=Carlo

并使用一个字符串 selected:

https://localhost:44358/Lists?SearchString=Anna

我想在没有selected 时显示所有记录,而在多个selected 时显示分配给人员的所有记录。我知道这个问题与我在 Index.cshtml.cs 文件中设置搜索字符串的方式有关,但我还没有找到修改它以使我的搜索完全起作用的方法。

我指的是:

.Where(s => s.DSM == (searchString))
CurrentFilter = searchString;

如有任何帮助,我们将不胜感激。

The search string result in the URL:

https://localhost:44358/Lists?SearchString=Anna&SearchString=Bernard&SearchString=Carlo

你需要用List<string> searchString接受所有选中的同名值SearchString,然后加上你对searchString的判断,例如:

public async Task<IActionResult> OnGet(List<string> searchString)
    {

        CurrentFilter = searchString;

        //condition to show all data
        if (searchString.Count == 0 || searchString[0] == "Choose a DSM...")
        {
            var projectlist = await _context.Project.ToListAsync();
        }
        //condition to show filtered data
        else
        {
            var projectlist = await _context.Project
                              .Include(pc => pc.ProjectComments)                
                              .Where(s => searchString.Contains(s.DSM))               
                              .ToListAsync();
        }
        //other logic
}