如何正确使用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

相关推荐

  • 光电通3104cdn连接电脑打印不正常怎么办?

    在日常办公环境中,打印机作为不可或缺的输出设备,其稳定性至关重要,即便是像光电通3104cdn这样性能可靠的机型,用户也时常会遇到连接电脑后打印不正常的困扰,这种问题可能表现为无法打印、打印乱码、打印任务卡住或打印机显示为离线状态等多种形式,面对这些情况,无需过于焦虑,通过系统性的排查,绝大多数问题都可以得到有……

    2025年10月25日
    04550
  • aspect分辨率是什么?如何设置它以改善视频画面比例?

    Aspect Resolution是数字媒体领域中一个核心概念,它结合了图像或视频的宽高比(Aspect Ratio)与分辨率(Resolution)两个关键参数,直接决定了内容在屏幕上的视觉呈现效果,在当前多设备、多场景的数字内容传播环境下,精准控制Aspect Resolution至关重要——它不仅影响画面……

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

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

      2026年1月10日
      020
  • 奥迪S5 CDN发动机属于哪一代技术,具体是第几代?

    奥迪S5的CDN发动机:技术解析与代系回顾CDN发动机简介CDN发动机,全称为Clean Diesel Network,是奥迪公司开发的一款高性能柴油发动机,这款发动机以其卓越的性能、高效的燃油经济性和较低的排放水平而受到市场的青睐,下面,我们将详细介绍奥迪S5所搭载的CDN发动机的代系及其特点,CDN发动机的……

    2025年11月12日
    02200
  • 如何正确获取和使用CDN增值电信业务经营许可证?法律合规要点详解!

    随着互联网技术的飞速发展,内容分发网络(CDN)已经成为提升网站访问速度、优化用户体验的关键技术,在我国,提供CDN增值电信业务的企业需要获得相应的经营许可证,本文将详细介绍CDN增值电信业务经营许可证的相关信息,CDN增值电信业务概述什么是CDN?分发网络,是一种通过在全球范围内部署节点,将网站内容缓存到离用……

    2025年11月16日
    02340

发表回复

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