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

相关推荐

  • 为何兄弟9020cdn打印机关闭设备后盖后盖关闭后无法正常打印?原因分析及解决方法?

    兄弟9020cdn打印机关闭设备后盖的注意事项与操作步骤关闭设备后盖的重要性打印机关闭设备后盖是确保打印设备正常工作的重要环节,关闭后盖可以防止灰尘、异物进入设备内部,避免机器损坏,延长设备使用寿命,关闭后盖还能保护操作人员的安全,防止意外发生,关闭设备后盖的注意事项关闭前检查在关闭设备后盖之前,请确保打印机关……

    2025年11月20日
    0730
  • asp.net如何与硬件结合实现高效交互?探讨跨领域融合挑战与机遇

    在当今数字化时代,软件开发与硬件设备的结合日益紧密,ASP.NET作为一种流行的Web开发框架,与硬件的结合应用正逐渐成为趋势,本文将探讨ASP.NET与硬件的融合,分析其优势和应用场景,并介绍一些实际案例,ASP.NET简介ASP.NET是由微软开发的一种用于构建动态网站、网络应用程序和Web服务的开发框架……

    2025年12月24日
    0330
    • 服务器间歇性无响应是什么原因?如何排查解决?

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

      2026年1月10日
      020
  • MP3105cdn一体机优缺点有哪些?还值得买吗?

    在当今快节奏的商业环境中,办公效率与成本控制是企业持续发展的核心要素,一台集打印、复印、扫描、传真功能于一体的多功能设备,不再是大型企业的专属,更成为众多中小型企业和工作组的“生产力倍增器”,理光MP 3105cdn彩色激光多功能一体机,正是这样一款为现代办公量身打造的紧凑型高效利器,它以其均衡的性能、丰富的功……

    2025年10月13日
    01040
  • 电信限制跑cdn服务,如何破解或合法合规应对解决方案?

    跑cdn被电信公司限制了怎么办?了解限制原因我们需要了解为什么电信公司会对您的CDN服务进行限制,通常情况下,限制可能由以下几个原因造成:流量过大:如果您的CDN流量超过了电信公司的规定限制,可能会导致限制措施,安全问题:如果您的CDN服务被用于传播非法内容或恶意攻击,电信公司可能会采取限制措施,竞争策略:电信……

    2025年12月10日
    0480

发表回复

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