2017-02-17 2 views
0

У меня есть своеобразный случай в ASP.Net Web Forms. У меня есть повторитель, в котором я хочу прокручивать список и генерировать элементы управления динамически.Как получить доступ к переменной цикла и переменной привязки в репитере ASP.Net?

Если я использую <%#,

<% 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, но не мой индексную переменную цикла. Я получаю ниже ошибки сборки:

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, имеет некоторые динамические столбцы. Я хочу добавить их динамически в зависимости от количества. Итак, мой Eval должен забрать v1_vendor_name, v2_vendor_name, если есть 2 столбца.

У меня есть v1_vendor_name, v2_vendor_name в DataTable, связанный с этим 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 Form. Как вы думаете, работает ли вложенный репитер? – techspider

ответ

0

Это, по-видимому, не похож на MVC Переберите в Repeater с связываемых переменных.

Когда в Repeater имеется переменная связывания, она ожидает, что это поле будет присутствовать в наборе данных, привязанных к этому элементу управления, независимо от условий, присутствующих в HTML. Он не выполняет предварительную проверку условий.

Для этого сценария я изменил свой набор данных на несколько строк вместо динамических столбцов и обработал с помощью вложенного ретранслятора.

-1

Я думаю, что вы неправильно понимаете использование Eval(), посмотрите на этот ответ, чтобы найти what is Eval() use for.

Это beign сказал, что если в твоих закладках удалить Eval из вашего кода, вы должны быть хорошо идти:

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

Смежные вопросы