Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 标记中的Foreach不';无法识别循环变量_C#_Asp.net_Webforms - Fatal编程技术网

C# 标记中的Foreach不';无法识别循环变量

C# 标记中的Foreach不';无法识别循环变量,c#,asp.net,webforms,C#,Asp.net,Webforms,我在用中继器控制。我的数据源中的所有属性名称都表示在我的ImportColumnsenum中 因此,我试图通过enums循环,将名称传递给Eval方法 这在我的中继器控件的ItemTemplate部分 Line 57: <tr class="ProductRow" data-id="<%# Eval("Id") %>"> Line 58: <% foreach (var column in (ImportColumns[])Enum.GetValues(

我在用中继器控制。我的数据源中的所有属性名称都表示在我的
ImportColumns
enum

因此,我试图通过
enum
s循环,将名称传递给
Eval
方法

这在我的中继器控件的
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>
没有错误。(尽管它不再满足我的需要。)


因此这与
Eval
有关,它阻止了“常规”变量的工作。有人知道这方面的解决方法吗?

我想您键入的是使用枚举项的名称作为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>
第57行:
第58行:
第59行:
第60行:
第61行:
编辑:

你说得对,我没有测试。我也不使用内联代码,所以我不理解其中的复杂性。这里有一个适合我的解决方案

我将把循环逻辑放在代码隐藏文件中的一个方法中,该文件创建完整的行,然后从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;
}
受保护的字符串ColumnDetail(){
string html=string.Empty;
foreach(Enum.GetNames(typeof(ImportColumns))中的字符串x){
html=(html+string.Format(“{0}”,Eval(x));
}
返回html;
}

无法识别
变量,因为当容器进行数据绑定时会计算
数据绑定表达式,而呈现页面时会执行
代码块。如果在错误页面上单击“显示完整的编译源”,您将看到

foreach (var column in (ImportColumns[])Enum.GetValues(typeof(ImportColumns))) {

位于两种不同的方法中

一种可能的解决方案是将循环和
Eval
组合成一个数据绑定表达式。例如:

<%#
    string.Concat(Enum.GetValues(typeof(ImportColumns)).Cast<ImportColumns>()
        .Select(column => "<td>" + Eval(column.ToString()) + "</td>")) 
%>
“”+Eval(column.ToString())+“”)
%>

我认为59处的错误是因为Eval希望处理数据绑定到中继器的对象。第57行中的Eval有效,因为ID是绑定到的任何对象的属性。column.ToString()不是该类的属性之一。当你说你的编辑不再做你需要的,它会做什么?它只是一个整数值吗?我知道
Eval
对数据绑定对象有效,但它使用字符串参数作为该对象上属性的名称。我不会更改正在评估的对象。我只更改字符串参数的来源。我不明白我在哪里说过我的编辑不再满足我的需要。不,错误是变量根本无法识别。而
Eval
需要一个字符串,因此
column.ToString()
应该可以正常工作。但这段代码对变量一无所知。是否尝试使用枚举项名称作为数据绑定对象的属性名称?当然可以。而名称正是使用
column.ToString()
获得的名称。使用
Enum.GetNames()
可能更有意义,我还没有看过。但这与我遇到的问题无关,我可以看到你没有测试它,因为它根本无法识别循环变量。在这一点上,我如何使用这个变量似乎并不重要。谢谢。正如我在问题中提出的,我知道这与
语法有关。但我似乎从未深入了解这些人在幕后的所作所为。仅供参考,我通过放弃中继器控制并使用
循环解决了这个问题。请再问一个问题。你提到的“显示完整编译源代码”链接在哪里。“我在错误页上看不到它。@乔纳森:当我尝试您的原始代码时,我会看到标准的ASP.NET“服务器错误”页,其中显示“说明”、“编译器错误消息”、“源错误”(源代码摘录为黄色)和“源文件”。下面是两个链接,“显示详细的编译器输出”和“显示完整的编译源代码”。谢谢,我将对此进行实验。似乎它只显示了一些错误。
Eval(column.ToString())
<%#
    string.Concat(Enum.GetValues(typeof(ImportColumns)).Cast<ImportColumns>()
        .Select(column => "<td>" + Eval(column.ToString()) + "</td>")) 
%>