Markup中的Foreach无法识别循环变量

时间:2014-05-28 21:36:37

标签: c# asp.net webforms

我正在使用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;工作中的变量。有没有人知道这个的解决方法?

2 个答案:

答案 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;
}