You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET(C#)中结合Eval函数使用IF ELSEIF ELSE条件的问题求助

ASP.NET C# 结合Eval实现多条件显示图片按钮

问题描述

我在ASP.NET C#项目中,需要在GridView的TemplateField里根据绑定字段dOR_4的值,显示不同的ImageButton:

  • 当dOR_4为R时,显示红色子弹图片
  • 当dOR_4为G时,显示金色子弹图片
  • 当dOR_4为V时,显示绿色子弹图片

最初尝试的代码如下,但报错:"Databinding methods such as Eval(), XPath(), and Bind() can only be used in the context of a databound control."

<asp:TemplateField
    HeaderText="text"
    ItemStyle-HorizontalAlign="Center"
    ItemStyle-CssClass="ddl_Class_new">
    <ItemTemplate>
        <% if (Eval("dOR_4").ToString().Equals("R"))
            { %>
        <asp:ImageButton ID="btn"
            ImageUrl="/Img/bullett/redbul.gif"
            runat="server" />
        <% }
        else if (Eval("dOR_4").ToString().Equals("G"))
        { %>
        <asp:ImageButton ID="btn"
            ImageUrl="/Img/bullett/goldbul.gif"
            runat="server" />
        <% }
        else if (Eval("dOR_4").ToString().Equals("V"))
        { %>
        <asp:ImageButton ID="btn"
            ImageUrl="/Img/bullett/forestbul.gif"
            runat="server" />
        <% } %>
    </ItemTemplate>
</asp:TemplateField>

之后改用三元运算符尝试,但无法显示goldbul.gif:

<asp:TemplateField
    HeaderText="text"
    ItemStyle-HorizontalAlign="Center"
    ItemStyle-CssClass="ddl_Class_new">
    <ItemTemplate>
        <asp:ImageButton ID="btn"
            ImageUrl='<%# Eval("dOR_4").ToString().Equals("R") ? 
                           "/Img/bullett/redbul.gif" :
                          Eval("dOR_4).ToString().Equals("G") ? 
                           "/Img/bullett/goldbul.gif" : "/Img/bullett/forestbul.gif" %>'
            runat="server" />
    </ItemTemplate>
</asp:TemplateField>

解决方案

方案1:修复三元运算符的语法问题

你之前的三元表达式里,Eval("dOR_4)少了闭合的双引号,导致语法错误,修正后即可正常运行:

<asp:TemplateField
    HeaderText="text"
    ItemStyle-HorizontalAlign="Center"
    ItemStyle-CssClass="ddl_Class_new">
    <ItemTemplate>
        <asp:ImageButton ID="btn"
            ImageUrl='<%# 
                Eval("dOR_4").ToString().Equals("R") ? "/Img/bullett/redbul.gif" :
                Eval("dOR_4").ToString().Equals("G") ? "/Img/bullett/goldbul.gif" :
                "/Img/bullett/forestbul.gif" 
            %>'
            runat="server" />
    </ItemTemplate>
</asp:TemplateField>

方案2:使用后台绑定方法(更易维护)

如果条件较多,推荐在后台代码中写一个绑定方法,逻辑更清晰,也方便后续修改:

后台代码(.aspx.cs)

public string GetBulletImageUrl(object dORValue)
{
    string value = dORValue?.ToString() ?? string.Empty;
    return value switch
    {
        "R" => "/Img/bullett/redbul.gif",
        "G" => "/Img/bullett/goldbul.gif",
        "V" => "/Img/bullett/forestbul.gif",
        _ => "/Img/bullett/forestbul.gif" // 默认值
    };
}

前台代码(.aspx)

<asp:TemplateField
    HeaderText="text"
    ItemStyle-HorizontalAlign="Center"
    ItemStyle-CssClass="ddl_Class_new">
    <ItemTemplate>
        <asp:ImageButton ID="btn"
            ImageUrl='<%# GetBulletImageUrl(Eval("dOR_4")) %>'
            runat="server" />
    </ItemTemplate>
</asp:TemplateField>

方案3:使用绑定代码块(<%# %>)替代普通代码块(<% %>)

最初的错误是因为使用了<% %>普通代码块,而Eval只能在绑定代码块<%# %>中使用,修改后可以保留多分支的if结构:

<asp:TemplateField
    HeaderText="text"
    ItemStyle-HorizontalAlign="Center"
    ItemStyle-CssClass="ddl_Class_new">
    <ItemTemplate>
        <%# 
            Eval("dOR_4").ToString().Equals("R") ? 
                "<asp:ImageButton ID='btn' ImageUrl='/Img/bullett/redbul.gif' runat='server' />" :
            Eval("dOR_4").ToString().Equals("G") ? 
                "<asp:ImageButton ID='btn' ImageUrl='/Img/bullett/goldbul.gif' runat='server' />" :
            "<asp:ImageButton ID='btn' ImageUrl='/Img/bullett/forestbul.gif' runat='server' />"
        %>
    </ItemTemplate>
</asp:TemplateField>

注意:这种方式需要将控件代码作为字符串返回,ASP.NET会解析并渲染对应的控件,适合简单场景。

内容的提问来源于stack exchange,提问作者George A. Custer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 11:17:57