使用多个过滤器进行过滤MVC

本文关键字:过滤 MVC 过滤器 | 更新日期: 2023-09-27 18:06:45

报表页面

我正在构建一个报表页面,它有多个过滤器,当用户选择0到all时,它显示所有列,并过滤所有数据。当选择多个过滤器时,我不确定如何连接过滤器。示例代码如下,我只发布了相关代码,因为它很长,控制器是从模型中拉出来的,这就是"IssueViewModel"的来源。我发现过滤器/搜索使用多字段- ASP。. NET MVC,但它需要我改变太多的代码,因为变量的问题,我已经写了。谢谢你!

控制器:

public ActionResult Reports(string JIssue, string Status)
    {
        string EX = "EX";
        var Issues = db.Data.Select(i => new IssueViewModel { });
if (JIssue == "2"){
            Issues = db.Data.Where(d => d.Column.Contains(EX)).Select(i => new IssueViewModel
        {
            Name = i.Name,
            Description = i.Description,
            Key = i.Key,
            LastUpdate = i.LastUpdate,
            ID = i.ID,
            IssueType = i.IssueType,
            ProgrammingStatus = i.ProgrammingStatus
        });  }
if (Status == "2"){
            Issues = db.Data.Where(d => d.Column2.Contains(1)).Select(i => new IssueViewModel
        {
            Name = i.Name,
            Description = i.Description,
            Key = i.Key,
            LastUpdate = i.LastUpdate,
            ID = i.ID,
            IssueType = i.IssueType,
            ProgrammingStatus = i.ProgrammingStatus
        });  }
        ViewBag.Issues = Issues.ToList();
        return View(); 

视图:

@Html.DropDownList("JIssue", new List<SelectListItem> {
      new SelectListItem { Text = "All", Value = "1", Selected = true},
      new SelectListItem { Text = "EX", Value = "2"},
      new SelectListItem { Text = "EXX", Value = "3"},
      new SelectListItem { Text = "EZX", Value = "4"},
      new SelectListItem { Text = "ABC", Value = "5"},
      new SelectListItem { Text = "BCD", Value = "6"},
      new SelectListItem { Text = "CDE", Value = "7"},   
 }, "Select Project")

使用多个过滤器进行过滤MVC

我看到了一些可能的改进。

1) JIssue字符串是您的输入之一。在这个例子中,如果它是2,那么你在Where子句中检查EX。如果您通过Text而不是Value搜索,则发送文本。这样就可以排除if语句。(我知道你对所有其他值有更多的if语句。)因此,您的第一个检查将归结为

Issues = db.Data.Where(d => d.Column.Contains(JIssue)).Select(...)

同样可以应用于Status。

2)在检查了每个条件之后,你得到了数据(通过执行Select)。相反,只有在运行所有Where子句之后才请求数据。或者,将所有条件包含在一个Where块中。

所以这将归结为以下内容:

public ActionResult Reports(string JIssue, string Status) 
{
    var Issues  = db.Data
        .Where(d => d.Column.Contains(JIssue) &&
                    d.Column2.Contains(1) &&
                    /* potential other conditions for other columns*/ )
        .Select(i => /* your mapping here */)
        .ToList();
    ViewBag.Issues = Issues;
    return View();
}