如何在GridView数据绑定中显示Glyphicon?及绑定错误排查
在GridView中根据Status字段显示Glyphicon图标
你遇到的服务器错误是ASP.NET Web Forms里数据绑定的典型问题——Eval()方法只能在数据绑定表达式上下文(也就是<%# %>标签)中使用,而你直接在<% if(...) %>这种普通服务器代码块里调用它,就会触发这个错误。下面给你几种可行的解决方案:
方案1:用三元运算符简化数据绑定表达式
这是最简洁的方式,把判断逻辑直接放到<%# %>里:
<ItemTemplate> <span class='glyphicon <%# (Eval("Status") != null && Convert.ToInt32(Eval("Status")) != 0) ? "glyphicon-unchecked" : "glyphicon-check" %>'></span> </ItemTemplate>
这里要注意先判断Eval("Status")不为null,再转换为int类型,避免空引用异常。如果你的Status字段本身就是非空的int类型,也可以简化成Convert.ToInt32(Eval("Status")) != 0。
方案2:后台定义绑定方法(适合复杂逻辑)
如果后续逻辑有扩展需求,或者需要做更多异常处理,推荐在后台代码(.aspx.cs)里写一个方法,前台直接调用:
protected string GetStatusIconClass(object statusObj) { // 处理null情况 if (statusObj == null) return "glyphicon-check"; // 尝试转换为int,避免格式错误 if (int.TryParse(statusObj.ToString(), out int status)) { return status != 0 ? "glyphicon-unchecked" : "glyphicon-check"; } // 默认返回已勾选图标 return "glyphicon-check"; }
前台ItemTemplate里这样调用:
<ItemTemplate> <span class='glyphicon <%# GetStatusIconClass(Eval("Status")) %>'></span> </ItemTemplate>
这种方式逻辑更清晰,也方便后续维护。
方案3:利用GridView的RowDataBound事件
如果需要对整行做更多操作,或者不想在前台写太多逻辑,可以用RowDataBound事件动态设置图标:
首先给前台的span加上ID和runat="server":
<ItemTemplate> <span ID="statusIcon" class="glyphicon" runat="server"></span> </ItemTemplate>
然后在后台代码里实现RowDataBound事件:
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) { // 只处理数据行,跳过表头、页脚等 if (e.Row.RowType == DataControlRowType.DataRow) { // 获取当前行的Status值 object statusObj = DataBinder.Eval(e.Row.DataItem, "Status"); HtmlGenericControl iconSpan = (HtmlGenericControl)e.Row.FindControl("statusIcon"); if (statusObj != null && int.TryParse(statusObj.ToString(), out int status)) { // 根据Status添加对应的图标类 iconSpan.Attributes["class"] += status != 0 ? " glyphicon-unchecked" : " glyphicon-check"; } else { iconSpan.Attributes["class"] += " glyphicon-check"; } } }
别忘了在GridView标签里绑定这个事件:OnRowDataBound="GridView1_RowDataBound"
以上三种方案都能解决你的问题,根据自己的需求选择就好~
内容的提问来源于stack exchange,提问作者Rod
相关产品推荐
相关产品推荐

