如何正确使用string.Format格式化Eval?Repeater曲目编号对齐问题
解决Repeater控件中TrackNo格式化问题
我看到你在使用Repeater展示CD曲目时,想把int类型的TrackNo格式化成带前导零的两位数字(比如01、02...10),但添加格式化代码后出了问题。咱们来看看问题出在哪,以及怎么解决:
你的代码问题分析
你当前的代码:
<td><%(string.Format("{0:00}", #EVAL("TrackNo")) %>: <%#Eval("SongName") %></td>
有两个关键语法错误:
- 数据绑定表达式应该用
<%#而非<%,<%是普通服务器代码块,无法在Repeater的绑定上下文里获取数据; #EVAL("TrackNo")里多了一个多余的#号,正确的写法是Eval("TrackNo")。
正确的解决方案
这里提供几种简单可靠的写法,你可以任选其一:
方案1:直接使用Eval的格式化参数(最简洁)
Eval方法本身支持传入格式化字符串作为第二个参数,直接就能实现需求:
<td><%# Eval("TrackNo", "{0:00}") %>: <%# Eval("SongName") %></td>
这个写法会自动把TrackNo(int类型)格式化为两位带前导零的字符串,比如1变成"01",10保持"10"。
方案2:显式转换类型后用string.Format
如果你想更明确地控制类型转换(比如避免潜在的类型转换异常),可以先把Eval返回的object转换成int,再格式化:
<td><%# string.Format("{0:00}", Convert.ToInt32(Eval("TrackNo"))) %>: <%# Eval("SongName") %></td>
如果TrackNo可能存在null值(比如数据源里允许空),可以再加个空值处理:
<td><%# string.Format("{0:00}", Eval("TrackNo") is int trackNo ? trackNo : 0) %>: <%# Eval("SongName") %></td>
为什么原来的代码失效?
在添加格式化之前,你应该是直接用<%# Eval("TrackNo") %>,这是正确的数据绑定表达式。但修改后错误地使用了<%标签,并且多写了#号,导致服务器无法正确解析数据绑定逻辑,所以就出问题了。
内容的提问来源于stack exchange,提问作者Johnny Bones
相关产品推荐
相关产品推荐

