2017-02-17 70 views
0

我在ASP.Net Web窗体中有一个奇怪的例子。我有一个中继器,我想循环一个列表并动态生成控件。我们如何在ASP.Net Repeater中访问循环变量和绑定变量?

如果我使用<%#

<% for (var index = 1; index < MyNamespace.Model.Count; index++) 
{ %> 
    <div style="font-weight: bold"><%# Eval(String.Format("v{0}_vendor_name", index.ToString())) %>: </div> 
<% } %> 

我可以进入评估和演示,但不是我的循环变量。我得到下面的生成错误:

The name 'index' doesn't exist in the current context.

如果我使用<%=

<% for (var index = 1; index < MyNamespace.Model.Count; index++) 
{ %> 
    <div style="font-weight: bold"><%= Eval(String.Format("v{0}_vendor_name", index.ToString())) %>: </div> 
<% } %> 

我没有得到任何编译错误,但是在运行时,我得到以下错误:

Databinding methods such as Eval(), XPath(), and Bind() can only be used in the context of a databound control.

我已经看过这个论坛上的一些问题,但他们都没有要求在一个语句中获取这两种类型的变量。

如果你想知道我在努力达到什么目的,我的DataTable绑定到这个Repeater有一些动态列。我想根据计数动态添加它们。所以,如果有2列,我的Eval应该选择v1_vendor_name,v2_vendor_name。

我有v1_vendor_name,v2_vendor_nameDataTable绑定到这个Repeater;而不是使用Eval("v1_vendor_name")Eval("v2_vendor_name"),我试图使用循环,因此Eval中的列是动态应用的。我必须动态执行此操作,因为我无法控制列的数量。它可能高达v10_vendor_name

我已经使用属性从后面的代码试图通过@tweray的建议,

for (this.index = 1; this.index < MyNamespace.Model.Count; this.index++) 
    { %> 
    <div style="font-weight: bold"><%# Eval(String.Format("v{0}_vendor_name", this.index.ToString())) %>: </div> 
<% } %> 

但是,this.index在EVAL始终以0即使我在循环分配1。

+0

为什么不使用嵌套中继器?或者,如果你能够,切换到ASP.NET MVC的Razor视图引擎,这是更清洁和漂亮的外观。 – mason

+0

@mason - 是的,它适用于MVC。但是,我必须插入对现有Web窗体应用程序的更改。你如何看待嵌入式中继器的工作原理? – techspider

回答

0

它显然是通过转换器使用绑定变量没有类似MVC循环。

当在Repeater中存在绑定变量时,它希望该字段出现在绑定到该控件的数据集中,而不考虑HTML中存在的条件。它不预先验证条件。

对于这种情况,我将数据集更改为多行而不是动态列,并使用嵌套中继器进行处理。

-1

我想你是误解了​​的用法,看看这个答案找what is Eval() use for

也就是说beign说,如果从你的代码的删除评估和演示,你要善于去:

<% for (var index = 1; index < 3; index++) 
{ %> 
    <div style="font-weight: bold"><%= String.Format("v{0}_vendor_name", index.ToString()) %>: </div> 
<% } %> 
+0

这将打印一个静态输出“v1_vendor_name”,“v2_vendor_name”等...我想在运行时使用'Eval(“v1_vendor_name”)'和'Eval(“v2_vendor_name”)''。列名需要动态传递给'Eval',以便从绑定数据中获取相应列中的值 – techspider

+0

您是否尝试将'硬编码3'更改为您的'MyNamespace.Model.Count'? –

+0

您的代码出现问题在'<%= String.Format(“v {0} _vendor_name”,index.ToString())%> – techspider