【问题标题】:How do we access loop variable and bind variable in ASP.Net Repeater?我们如何在 ASP.Net Repeater 中访问循环变量和绑定变量?
【发布时间】: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 但不能访问我的循环索引变量。我得到以下构建错误:

当前上下文中不存在名称“索引”。

如果我使用&lt;%=

 <% 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。

我在绑定到这个RepeaterDataTable中有v1_vendor_namev2_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


【解决方案1】:

用绑定变量在Repeater中循环显然不像MVC。

当Repeater 中有一个绑定变量时,它期望该字段出现在绑定到该控件的数据集中,而不管HTML 中存在什么条件。它不会预先验证条件。

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

【讨论】:

    【解决方案2】:

    我想你对Eval()的用法有误解,看这个答案找到what is Eval() use for

    也就是说,如果你从代码中删除 Eval,你应该很高兴:

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

    【讨论】:

    • 这将打印静态输出“v1_vendor_name”、“v2_vendor_name”等...我想要在运行时Eval("v1_vendor_name")Eval("v2_vendor_name")。列名需要动态传递给Eval,以便从我的绑定数据中获取相应列内的值
    • 您是否尝试将我的hard-coded 3 更改为您的MyNamespace.Model.Count
    • 您的代码有问题在&lt;%= String.Format("v{0}_vendor_name", index.ToString()) %&gt;
    • 究竟是什么问题?它会崩溃吗?我只是删除 Eval() 并将您的模型替换为固定数字
    猜你喜欢
    • 2017-03-24
    • 2010-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多