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

相关推荐

  • CDN托管模式详解,合法合规性及运作原理是什么?

    CDN托管模式详解及其合法性探讨什么是CDN托管?CDN托管,即内容分发网络托管,是一种通过在全球多个节点部署服务器,将网站内容缓存到这些节点上,当用户访问网站时,根据用户所在地理位置,将最接近用户的服务器上的内容发送给用户,从而加快网站访问速度的技术服务,CDN托管模式的特点分布式存储:CDN托管将内容分发到……

    2025年11月29日
    04160
  • ASP.NET省份数据处理常见疑问,如何解决省份信息获取问题?

    ASP.NET技术在{省份,如广东省}企业应用的深度实践与云服务优化策略ASP.NET作为微软推出的企业级Web开发框架,凭借其强大的性能、灵活的架构与丰富的生态,在国内外企业信息化建设中占据核心地位,尤其在人口密集、企业数量众多的省份(如广东省),ASP.NET技术的应用场景愈发广泛,从电商平台的快速迭代到金……

    2026年1月25日
    0410
  • 光电通oep3115cdn打印机A5打印效果好不好?

    在现代办公与创意工作领域,对打印设备的需求早已超越了单一的A4文档输出,多样化的介质尺寸处理能力,成为衡量一台多功能一体机是否“全能”的重要标尺,在众多产品中,光电通OEP3115CDN彩色激光多功能一体机凭借其紧凑的设计、稳定的性能以及对包括A5在内的多种纸张尺寸的出色支持,成为了小型办公室(SOHO)、工作……

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

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

      2026年1月10日
      020
  • 关于asp.net光盘,你了解它的实际价值吗?

    ASP.NET光盘的详细解析与应用实践ASP.NET作为微软推出的企业级Web开发框架,自2002年发布以来便成为构建动态网站、Web应用的核心工具,传统部署中,ASP.NET光盘作为离线安装介质,承载着框架的安装程序、示例项目及技术文档,是企业IT部门部署新系统或更新旧系统的关键载体,尽管现代网络环境允许通过……

    2026年1月31日
    0410

发表回复

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