如何正确使用Eval和Bind进行数据绑定?Asp.net数据绑定实战详解

在 ASP.NET Web Forms 中,Eval()Bind() 是数据绑定表达式中的关键方法,主要用于在数据绑定控件(如 GridView、DetailsView 等)中处理数据,以下是它们的区别和应用示例:

Asp.net中的数据绑定Eval和Bind应用示例

核心区别

特性 Eval() Bind()
绑定方向 单向(只读) 双向(读写)
使用场景 仅显示数据(ItemTemplate) 编辑/插入数据(EditItemTemplate)
数据更新 ❌ 不支持回发更新 ✅ 支持回发更新
性能 更轻量 略重(需维护视图状态)
语法 <%# Eval("字段名") %> <%# Bind("字段名") %>

应用示例

示例 1:GridView 中使用 Eval 和 Bind

<asp:GridView ID="gvEmployees" runat="server" AutoGenerateColumns="false"
    DataKeyNames="EmployeeID" OnRowEditing="gvEmployees_RowEditing"
    OnRowUpdating="gvEmployees_RowUpdating">
    <Columns>
        <!-- 只读列:使用 Eval -->
        <asp:TemplateField HeaderText="ID">
            <ItemTemplate>
                <%# Eval("EmployeeID") %>
            </ItemTemplate>
        </asp:TemplateField>
        <!-- 可编辑列:EditTemplate 中使用 Bind -->
        <asp:TemplateField HeaderText="姓名">
            <ItemTemplate>
                <%# Eval("Name") %>  <!-- 显示模式 -->
            </ItemTemplate>
            <EditItemTemplate>
                <asp:TextBox ID="txtName" runat="server" 
                    Text='<%# Bind("Name") %>' />  <!-- 编辑模式 -->
            </EditItemTemplate>
        </asp:TemplateField>
        <!-- 下拉列表示例 -->
        <asp:TemplateField HeaderText="部门">
            <EditItemTemplate>
                <asp:DropDownList ID="ddlDept" runat="server"
                    SelectedValue='<%# Bind("DepartmentID") %>'>  <!-- 绑定选中值 -->
                    <asp:ListItem Value="1">技术部</asp:ListItem>
                    <asp:ListItem Value="2">市场部</asp:ListItem>
                </asp:DropDownList>
            </EditItemTemplate>
            <ItemTemplate>
                <%# Eval("DepartmentName") %>  <!-- 显示部门名称 -->
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

后台代码(C#)

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        BindGridView();
    }
}
private void BindGridView()
{
    // 从数据库获取数据(此处简化为模拟数据)
    var employees = new List<Employee> {
        new Employee { EmployeeID = 1, Name = "张三", DepartmentID = 1, DepartmentName = "技术部" },
        new Employee { EmployeeID = 2, Name = "李四", DepartmentID = 2, DepartmentName = "市场部" }
    };
    gvEmployees.DataSource = employees;
    gvEmployees.DataBind();
}
protected void gvEmployees_RowEditing(object sender, GridViewEditEventArgs e)
{
    gvEmployees.EditIndex = e.NewEditIndex;
    BindGridView();
}
protected void gvEmployees_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
    // 通过 Bind 自动获取修改后的值
    int employeeId = (int)gvEmployees.DataKeys[e.RowIndex].Value;
    GridViewRow row = gvEmployees.Rows[e.RowIndex];
    string newName = ((TextBox)row.FindControl("txtName")).Text;
    int newDeptId = int.Parse(((DropDownList)row.FindControl("ddlDept")).SelectedValue);
    // 更新数据库(伪代码)
    // UpdateEmployee(employeeId, newName, newDeptId);
    gvEmployees.EditIndex = -1;
    BindGridView();
}

示例 2:FormView 中使用 Bind

<asp:FormView ID="fvEmployee" runat="server" DataKeyNames="EmployeeID"
    DefaultMode="Insert" OnItemInserting="fvEmployee_ItemInserting">
    <InsertItemTemplate>
        <div>
            <label>姓名:</label>
            <asp:TextBox ID="txtName" runat="server" Text='<%# Bind("Name") %>' />
        </div>
        <div>
            <label>邮箱:</label>
            <asp:TextBox ID="txtEmail" runat="server" Text='<%# Bind("Email") %>' />
        </div>
        <asp:Button runat="server" CommandName="Insert" Text="保存" />
    </InsertItemTemplate>
</asp:FormView>

后台代码(C#)

protected void fvEmployee_ItemInserting(object sender, FormViewInsertEventArgs e)
{
    // 通过 Bind 自动收集的值会存在于 e.Values 中
    string name = e.Values["Name"].ToString();
    string email = e.Values["Email"].ToString();
    // 插入数据库(伪代码)
    // InsertEmployee(name, email);
    fvEmployee.ChangeMode(FormViewMode.ReadOnly);
    // 重新绑定数据...
}

关键注意事项

  1. Bind() 必须配合数据操作事件
    如 GridView 的 RowUpdating、FormView 的 ItemInserting,在这些事件中通过 e.Values 或控件查找获取值。

  2. 数据源要求
    若使用 SqlDataSource 等声明式数据源,Bind() 可自动处理更新,无需手动编码。

    Asp.net中的数据绑定Eval和Bind应用示例

  3. 视图状态开销
    Bind() 依赖视图状态存储原始值,在大型数据集场景中需评估性能影响。

  4. 格式处理
    可在表达式中直接格式化数据:

    Asp.net中的数据绑定Eval和Bind应用示例

    <%# Eval("HireDate", "{0:yyyy-MM-dd}") %>  <!-- 日期格式化 -->
    <%# Bind("Salary", "{0:C}") %>             <!-- 货币格式化 -->

通过合理使用 Eval()Bind(),可以高效实现数据的显示和编辑功能。Eval() 适用于只读场景,而 Bind() 则是编辑/插入数据的首选方案。

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

(0)
上一篇 2026年2月8日 22:32
下一篇 2026年2月8日 22:41

相关推荐

  • 天津光电mp3100cdn一体机耗材在哪里买最便宜划算?

    天津光电MP3100CDN作为一款功能强大的彩色激光多功能一体机,在中小企业和办公环境中广受欢迎,其卓越的打印、复印、扫描性能离不开稳定可靠的耗材支持,正确选择并使用合适的耗材,不仅是保证高质量输出的前提,更是维持设备长久稳定运行、控制总体拥有成本的关键,本文将围绕天津光电MP3100CDN一体机的耗材进行深入……

    2025年10月19日
    02740
  • 光纤存储交换机怎么连接服务器吗?光纤交换机连接服务器教程

    光纤存储交换机连接服务器的核心结论与实施策略光纤存储交换机连接服务器的关键在于构建高带宽、低延迟的无损网络架构,其核心流程并非简单的物理连线,而是涉及HBA 卡选型、光纤链路拓扑规划、交换机端口配置及多路径冗余策略的系统工程,要实现服务器与存储设备的高效互联,必须确保光模块波长匹配、光纤类型一致,并严格配置FC……

    2026年5月1日
    0431
  • Mockito MockBean不能mock MyBatis Mapper解决方法

    在使用 MockBean 注解来模拟 MyBatis 接口(interface)的bean(例如 DAO)时遇到了问题,下面介绍一下不能mock MyBatis Mapper解决方…

    2021年12月10日
    01.5K0
    • 服务器间歇性无响应是什么原因?如何排查解决?

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

      2026年1月10日
      020
  • 光猫远程控制服务器怎么用,光猫远程连接方法

    2026 年光猫远程控制服务器已不再是极客专属,而是企业实现低成本运维与家庭网络智能化的核心枢纽,通过内置边缘计算网关与标准化 API 接口,可实现毫秒级远程指令下发与状态监控,随着 2026 年“东数西算”工程全面深化及 5G-A(5.5G)商用普及,光猫(ONT)的角色已从单纯的光电转换设备演变为家庭与企业……

    2026年5月8日
    0262

发表回复

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