【发布时间】:2017-02-17 17:39:28
【问题描述】:
我在 ASP.Net Web 表单中有一个特殊的案例。我有一个中继器,我想在其中循环遍历一个列表并动态生成控件。
如果我使用<%#,
<% for (var index = 1; index < MyNamespace.Model.Count; index++)
{ %>
<div style="font-weight: bold"><%# Eval(String.Format("v{0}_vendor_name", index.ToString())) %>: </div>
<% } %>
我可以访问 Eval 但不能访问我的循环索引变量。我得到以下构建错误:
当前上下文中不存在名称“索引”。
如果我使用<%=,
<% for (var index = 1; index < MyNamespace.Model.Count; index++)
{ %>
<div style="font-weight: bold"><%= Eval(String.Format("v{0}_vendor_name", index.ToString())) %>: </div>
<% } %>
我没有收到任何构建错误,但在运行时,我收到以下错误:
Eval()、XPath() 和 Bind() 等数据绑定方法只能 在数据绑定控件的上下文中使用。
我在这个论坛上查看了许多问题,但没有一个问题要求在单个语句中获取两种类型的变量。
如果您想知道我想要实现什么,我的DataTable 绑定到这个Repeater 有一些动态列。我想根据计数动态添加它们。所以,如果有 2 列,我的 Eval 应该选择 v1_vendor_name、v2_vendor_name。
我在绑定到这个Repeater的DataTable中有v1_vendor_name,v2_vendor_name;我没有使用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>
<% } %>
但是,即使我在循环中分配了 1,eval 中的 this.index 总是取 0。
【问题讨论】:
-
为什么不使用嵌套中继器?或者,如果可以的话,切换到带有 Razor 视图引擎的 ASP.NET MVC,这样看起来更干净、更漂亮。
-
@mason - 是的,它适用于 MVC。但是,我必须插入对现有 Web 窗体应用程序的更改。您认为嵌套中继器如何工作?
标签: c# asp.net webforms repeater