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

相关推荐

  • ASP.NET开发中怎样突破文件依赖缓存?

    ASP.NET开发中怎样去突破文件依赖缓存ASP.NET作为微软推出的主流Web开发框架,在处理静态文件和动态内容时,文件依赖缓存机制是其核心优化点之一,不当配置或理解偏差可能导致文件无法及时更新,影响开发体验和用户体验,本文将系统解析文件依赖缓存的工作原理,分析常见问题,并提供可落地的突破策略,结合酷番云的实……

    2026年1月11日
    01040
  • MP4分割M3U8并上传CDN的详细步骤是什么?

    在当今的流媒体时代,视频内容的交付速度和播放体验直接关系到用户的留存和满意度,一个原始的、体积庞大的MP4文件,如果直接面向全球用户播放,往往会因为网络波动、地域差异等问题导致加载缓慢、卡顿频繁,为了解决这一核心痛点,业界普遍采用一种高效的解决方案:将MP4视频分割成M3U8格式,并上传至CDN(内容分发网络……

    2025年10月17日
    01810
  • ASP.NET如何连接数据库文件?详细步骤与SqlConnection对象使用指南

    在ASP.NET中访问数据库文件,通常涉及以下步骤,这里以常见的SQL Server数据库文件(.mdf)和SQLite数据库文件(.db)为例,分别说明访问方法:访问SQL Server数据库文件 (.mdf)配置连接字符串在Web.config文件中添加连接字符串(使用LocalDB或SQL Server……

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

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

      2026年1月10日
      020
  • CDN服务器如何运作?其核心原理及具体作用是什么?

    CDN服务器的原理与作用CDN服务器的原理1 分布式架构CDN(Content Delivery Network,内容分发网络)服务器采用分布式架构,通过在全球范围内部署多个节点,将内容存储在离用户最近的服务器上,从而提高内容的访问速度和稳定性,2 负载均衡CDN服务器通过负载均衡技术,将用户请求分配到最合适的……

    2025年11月9日
    01020

发表回复

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