在下拉菜单中选择多个条目时,多选下拉菜单搜索字符串结果

问题描述 投票:0回答:1

我已经建立了一个下拉菜单,其名称作为过滤器应用于项目表。我希望能够从下拉列表中选择多个条目并将其用作过滤器。单一条目过滤器可以正常工作,但是多重选择搜索过滤器不会返回任何项目记录。在下拉菜单中未选择任何内容时,也不会显示任何项目。当搜索过滤器为空时,如何修改搜索参数结果以显示所有项目,并显示分配给在下拉菜单中选择的多个人员的项目。

我的项目班级:

    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

并且选择了一个字符串:

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

我想在没有选择任何内容的情况下显示所有记录,并且在选择多个名字的情况下显示所有分配给人员的记录。我知道该问题与我在Index.cshtml.cs文件中设置搜索字符串的方式有关,但是我没有找到一种方法可以对其进行修改以使搜索完全起作用。

我指的是:

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

任何帮助将不胜感激。

asp.net-core search multipleselection multiple-select-query
1个回答
0
投票

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
}
© www.soinside.com 2019 - 2024. All rights reserved.