ASP.NET三层架构如何实现多条件检索?完整示例及代码解析详解

ASP.NET 三层架构多条件检索示例

实体层 (Entity Layer)

// User.cs
public class UserEntity
{
    public int ID { get; set; }
    public string UserName { get; set; }
    public string Email { get; set; }
    public bool Status { get; set; } // 状态: 启用/禁用
}

数据访问层 (DAL)

1 接口定义

// IUserDal.cs
public interface IUserDal
{
    List<UserEntity> GetUserByConditions(
        string userName, 
        string email, 
        bool? status,
        int? pageSize,
        int? pageNumber);
}

2 实现类

// UserDal.cs
public class UserDal : IUserDal
{
    private readonly string _connectionString;
    public UserDal(string connectionString)
    {
        _connectionString = connectionString;
    }
    public List<UserEntity> GetUserByConditions(
        string userName, 
        string email, 
        bool? status,
        int? pageSize,
        int? pageNumber)
    {
        string sql = "SELECT * FROM Users WHERE 1=1";
        List<SqlParameter> parameters = new List<SqlParameter>();
        // 构建条件查询
        if (!string.IsNullOrEmpty(userName))
        {
            sql += " AND UserName LIKE @UserName";
            parameters.Add(new SqlParameter("@UserName", $"%{userName}%"));
        }
        if (!string.IsNullOrEmpty(email))
        {
            sql += " AND Email LIKE @Email";
            parameters.Add(new SqlParameter("@Email", $"%{email}"));
        }
        if (status.HasValue)
        {
            sql += " AND Status = @Status";
            parameters.Add(new SqlParameter("@Status", status.Value));
        }
        // 分页处理
        if (pageSize.HasValue && pageNumber.HasValue)
        {
            sql += " ORDER BY ID OFFSET (@PageNumber - 1) * @PageSize ROWS FETCH NEXT @PageSize ROWS ONLY";
            parameters.Add(new SqlParameter("@PageSize", pageSize.Value));
            parameters.Add(new SqlParameter("@PageNumber", pageNumber.Value));
        }
        using (SqlConnection conn = new SqlConnection(_connectionString))
        {
            SqlCommand cmd = new SqlCommand(sql, conn);
            cmd.Parameters.AddRange(parameters.ToArray());
            using (SqlDataReader reader = cmd.ExecuteReader())
            {
                List<UserEntity> users = new List<UserEntity>();
                while (reader.Read())
                {
                    users.Add(new UserEntity
                    {
                        ID = reader.GetInt32(0),
                        UserName = reader.GetString(1),
                        Email = reader.GetString(2),
                        Status = reader.GetBoolean(3)
                    });
                }
                return users;
            }
        }
    }
}

业务逻辑层 (BLL)

1 接口定义

// IUserBll.cs
public interface IUserBll
{
    List<UserEntity> GetUserByConditions(
        string userName, 
        string email, 
        bool? status,
        int? pageSize,
        int? pageNumber);
}

2 实现类

// UserBll.cs
public class UserBll : IUserBll
{
    private readonly IUserDal _userDal;
    public UserBll(IUserDal userDal)
    {
        _userDal = userDal;
    }
    public List<UserEntity> GetUserByConditions(
        string userName, 
        string email, 
        bool? status,
        int? pageSize,
        int? pageNumber)
    {
        return _userDal.GetUserByConditions(userName, email, status, pageSize, pageNumber);
    }
}

表示层 (ASPX页面)

1 页面布局

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Search.aspx.cs" Inherits="Search" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">多条件检索示例</title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <h2>用户多条件检索</h2>
            <div>
                <asp:TextBox ID="txtUserName" runat="server" placeholder="用户名" />
                <asp:TextBox ID="txtEmail" runat="server" placeholder="邮箱" />
                <asp:CheckBox ID="chkStatus" runat="server" Text="启用" Checked="true" />
                <asp:Button ID="btnSearch" runat="server" Text="搜索" OnClick="btnSearch_Click" />
            </div>
            <asp:GridView ID="gvUsers" runat="server" 
                AutoGenerateColumns="False" 
                AllowPaging="True" 
                OnPageIndexChanging="gvUsers_PageIndexChanging">
                <Columns>
                    <asp:BoundField DataField="ID" HeaderText="ID" />
                    <asp:BoundField DataField="UserName" HeaderText="用户名" />
                    <asp:BoundField DataField="Email" HeaderText="邮箱" />
                    <asp:BoundField DataField="Status" HeaderText="状态" />
                </Columns>
            </asp:GridView>
        </div>
    </form>
</body>
</html>

2 代码隐藏文件

// Search.aspx.cs
public partial class Search : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            BindUsers();
        }
    }
    protected void btnSearch_Click(object sender, EventArgs e)
    {
        BindUsers();
    }
    protected void BindUsers()
    {
        // 获取查询参数
        string userName = txtUserName.Text.Trim();
        string email = txtEmail.Text.Trim();
        bool? status = chkStatus.Checked;
        // 获取分页参数
        int pageSize = 10; // 默认每页10条
        int pageNumber = gvUsers.PageIndex + 1;
        // 创建BLL实例
        UserBll userBll = new UserBll(new UserDal(ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString));
        // 调用BLL方法
        List<UserEntity> users = userBll.GetUserByConditions(
            userName, 
            email, 
            status,
            pageSize,
            pageNumber);
        // 绑定数据
        gvUsers.DataSource = users;
        gvUsers.DataBind();
    }
    protected void gvUsers_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {
        gvUsers.PageIndex = e.NewPageIndex;
        BindUsers();
    }
}

使用说明

  1. 数据库准备

    ASP.NET三层架构如何实现多条件检索?完整示例及代码解析详解

    • 创建Users表,包含ID, UserName, Email, Status字段
    • 插入测试数据
  2. 配置连接字符串

    在Web.config中添加数据库连接字符串

    ASP.NET三层架构如何实现多条件检索?完整示例及代码解析详解

  3. 运行效果

    • 用户可以通过输入用户名、邮箱和状态来筛选
    • 支持分页显示结果
  4. 关键特性

    ASP.NET三层架构如何实现多条件检索?完整示例及代码解析详解

    • 三层架构分离关注点
    • 参数化查询防止SQL注入
    • 分页功能集成
    • 响应式搜索逻辑

这个示例展示了如何使用三层架构实现灵活的多条件检索功能,同时保持代码的可维护性和扩展性。

图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/218511.html

(0)
上一篇 2026年1月8日 20:24
下一篇 2026年1月8日 20:26

相关推荐

  • 光环devops培训是什么?光环devops培训怎么样

    2026 年选择光环国际 DevOps 培训是提升企业交付效率与个人职业竞争力的最优解,其核心优势在于深度融合了云原生架构实战与国产化信创标准,能精准解决从传统运维向平台工程转型的痛点,2026 年 DevOps 人才市场核心趋势与价值在 2026 年的技术版图中,DevOps 已不再是单纯的“开发运维一体化……

    2026年5月8日
    01803
  • CDN二级源和源站到底有什么本质区别?

    分发网络(CDN)的架构中,源站与二级源是两个核心但角色迥异的概念,理解它们之间的区别,对于优化网站性能、保障服务稳定性和控制成本具有重要的现实意义,许多用户对这两个术语感到困惑,常常将它们混为一谈,它们在CDN的内容流转链路中处于不同的位置,承担着截然不同的职责,本文将深入剖析CDN源站与二级源的内涵、功能差……

    2025年10月16日
    04050
  • 光谷有轨电车如何优化智能交通体系,光谷有轨电车智能交通体系优化方案

    光谷有轨电车优化智能交通体系的核心策略与实战路径光谷有轨电车实现智能交通体系优化的关键在于构建“车 – 路 – 云”深度协同的实时决策系统,通过引入边缘计算与高并发云架构,将信号优先响应时间压缩至毫秒级,从而在保障安全的前提下,将整体通行效率提升 30% 以上, 这一结论并非理论推演,而是基于当前城市交通痛点与……

    2026年4月22日
    01550
    • 服务器间歇性无响应是什么原因?如何排查解决?

      根源分析、排查逻辑与解决方案服务器间歇性无响应是IT运维中常见的复杂问题,指服务器在特定场景下(如高并发时段、特定操作触发时)出现短暂无响应、延迟或服务中断,而非持续性的宕机,这类问题对业务连续性、用户体验和系统稳定性构成直接威胁,需结合多维度因素深入排查与解决,常见原因分析:从硬件到软件的多维溯源服务器间歇性……

      2026年1月10日
      020
  • 小米盒子连接无线网络时,如何确保cdn服务稳定?

    在家庭娱乐系统中,小米盒子作为一款流行的智能电视盒子,其无线网络连接的稳定性和速度直接影响到用户的观看体验,本文将详细介绍如何连接小米盒子到无线网络,并进行CDN检测,以确保网络服务的质量,小米盒子无线网络连接步骤准备工作在开始连接之前,请确保您的无线网络已开启,并且您已经知道无线网络的名称(SSID)和密码……

    2025年12月2日
    03640

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注