我正在使用Repeater控件。我的数据源中的所有媒体资源名称都显示在我的ImportColumns
enum
。
所以我试图遍历enum
以将名称传递给Eval
方法。
这是我的Repeater控件的ItemTemplate
部分。
Line 57: <tr class="ProductRow" data-id="<%# Eval("Id") %>">
Line 58: <% foreach (var column in (ImportColumns[])Enum.GetValues(typeof(ImportColumns))) { %>
Line 59: <td><%# Eval(column.ToString()) %></td>
Line 60: <% } %>
Line 61: </tr>
但第59行给出了以下错误。
CS0103:名称&#39;列&#39;在当前上下文中不存在
为什么代码不识别column
变量?我猜测它与我在转发器控件中的事实或我错过了<% %>
代码和<%# %>
这一事实有关,但它似乎这应该有效。
修改
如果我改变第59行,我会看到。
<td><%= column.ToString() %></td>
没有错误。 (虽然它不再符合我的需要。)
所以这与Eval
有关,可以阻止&#34;常规&#34;工作中的变量。有没有人知道这个的解决方法?
答案 0 :(得分:1)
无法识别column
变量,因为在容器受数据绑定时会计算<%# ... %>
数据绑定表达式,而在<% ... %>
和<%= ... %>
代码块执行时页面呈现。如果单击错误页面上的“显示完整编译源”,您将看到
foreach (var column in (ImportColumns[])Enum.GetValues(typeof(ImportColumns))) {
和
Eval(column.ToString())
位于两种不同的方法中。
一种可能的解决方案是将循环和Eval
组合成单个数据绑定表达式。例如:
<%#
string.Concat(Enum.GetValues(typeof(ImportColumns)).Cast<ImportColumns>()
.Select(column => "<td>" + Eval(column.ToString()) + "</td>"))
%>
答案 1 :(得分:0)
我认为您要键入的内容是使用枚举条目的名称作为Eval的属性名称
如果是,则使用Enum.GetNames而不是GetValues方法。
Line 57: <tr class="ProductRow" data-id="<%# Eval("Id") %>">
Line 58: <% foreach (string column in Enum.GetNames(typeof(ImportColumns))) { %>
Line 59: <td><%# Eval(column) %></td>
Line 60: <% } %>
Line 61: </tr>
修改:
你是对的我没有测试过。我也不使用内联代码,所以我不明白复杂性。这是一个适合我的解决方案。
我会将该循环逻辑放在代码隐藏文件中的方法中,该方法创建完整的行,然后从aspx页面调用它。
在aspx中
<tr class="ProductRow" data-id="<%# Eval("Id") %>">
<%# this.ColumnDetail() %>
</tr>
背后的代码中的方法
protected string ColumnDetail() {
string html = String.Empty;
foreach (string x in Enum.GetNames(typeof(ImportColumns))) {
html = (html + string.Format("<td>{0}</td>", Eval(x)));
}
return html;
}