ASP.NET Core Razor页面多条件联合搜索功能实现求助
解决多字段同时过滤的问题
单字段搜索通常依赖if-else互斥判断,只会执行第一个匹配的条件,这就是多字段无法同时生效的核心原因。正确的做法是逐步叠加查询条件,只要参数有值就添加对应过滤规则,而非互斥判断。
1. 后端查询构建(Entity Framework 示例)
假设你用EF Core开发,在Controller的Action中接收所有搜索参数,基于IQueryable的延迟执行特性拼接条件:
public IActionResult PurchasedItems(string serialDescription, string sNo, /* 其他8个字段参数 */) { // 基础查询,此时并未执行数据库操作 IQueryable<Purchased> query = _context.Purchased; // 逐个判断参数,有有效值就叠加过滤条件 if (!string.IsNullOrEmpty(serialDescription)) { query = query.Where(p => p.SerialDescription.Contains(serialDescription, StringComparison.OrdinalIgnoreCase)); } if (!string.IsNullOrEmpty(sNo)) { query = query.Where(p => p.SNo.Contains(sNo, StringComparison.OrdinalIgnoreCase)); } // 其他8个字段同理,重复上述判断逻辑 // if (!string.IsNullOrEmpty(xxx)) { query = query.Where(...); } // 最终执行查询并返回结果 var result = query.ToList(); return View(result); }
所有Where条件会被拼接成单条SQL语句,同时作用于数据库,实现多字段联合过滤。
2. 原生SQL拼接(非EF场景)
如果使用原生ADO.NET,必须用参数化查询避免SQL注入,同时通过1=1简化条件拼接:
public List<Purchased> GetFilteredItems(string serialDescription, string sNo) { List<Purchased> items = new List<Purchased>(); string sql = "SELECT * FROM dbo.Purchased WHERE 1=1"; List<SqlParameter> parameters = new List<SqlParameter>(); if (!string.IsNullOrEmpty(serialDescription)) { sql += " AND SerialDescription LIKE @SerialDescription"; parameters.Add(new SqlParameter("@SerialDescription", $"%{serialDescription}%")); } if (!string.IsNullOrEmpty(sNo)) { sql += " AND SNo LIKE @SNo"; parameters.Add(new SqlParameter("@SNo", $"%{sNo}%")); } // 其他字段同理添加参数和条件 using (SqlConnection conn = new SqlConnection(_connectionString)) { conn.Open(); using (SqlCommand cmd = new SqlCommand(sql, conn)) { cmd.Parameters.AddRange(parameters.ToArray()); using (SqlDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { // 将读取到的数据映射到Purchased对象,添加到items列表 } } } } return items; }
3. 前端表单注意事项
确保Razor页面表单中,所有搜索框的name属性与后端Action的参数名完全匹配(大小写不敏感,但建议统一):
<form method="get" asp-action="PurchasedItems"> <input type="text" name="serialDescription" placeholder="Serial Description" /> <input type="text" name="sNo" placeholder="SNo" /> <!-- 其他8个搜索框 --> <button type="submit">搜索</button> </form>
常见坑点
- 禁用
if-else if:这种互斥判断只会执行第一个匹配条件,直接导致多字段过滤失效。 - 空值校验:必须先判断参数是否为空/空字符串,否则
Contains(null)会过滤掉所有数据。 - 大小写处理:如需忽略大小写,EF中用
StringComparison.OrdinalIgnoreCase,SQL中可使用LOWER(字段名) LIKE LOWER(@参数)(需注意数据库排序规则)。
内容的提问来源于stack exchange,提问作者Predator1706
相关产品推荐
相关产品推荐

