You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 22:22:26