2017-02-17 47 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