Как сохранить значение выражения привязки данных в переменную - PullRequest
5 голосов
/ 14 июля 2009

Мне нужно несколько раз получить доступ к значению связанного элемента в шаблоне. Прямо сейчас мой шаблон ListView выглядит так:

<asp:ListView ID="ListView1" runat="server" ItemPlaceholderID="plc"><br/>
 <ItemTemplate><br/>
  <input type="radio" class="myrating<%# DataBinder.Eval(Container.DataItem, "Day")%>" value="3" /><br/>
  <input type="radio" class="myrating<%# DataBinder.Eval(Container.DataItem, "Day")%>" value="4" /><br/>
    </ItemTemplate><br/>
    <LayoutTemplate><br/>
        <div id="plc" runat="server"><br/>
        </div><br/>
    </LayoutTemplate><br/>
    <EmptyDataTemplate><br/>
        No data</EmptyDataTemplate><br/>
</asp:ListView><br/>

При определенных условиях у меня могут быть десятки переключателей, поэтому повторный вызов <%# DataBinder.Eval(Container.DataItem, "Day")%> кажется неэффективным.

Я бы хотел присвоить значение этого выражения переменной, а затем использовать эту переменную, чтобы мой шаблон выглядел примерно так

<ItemTemplate><br />
<%String ClassName = "myrating" + <%# DataBinder.Eval(Container.DataItem, "Day")%><br />
  <input type="radio" class="<%=ClassName %>" value="3" /><br />
  <input type="radio" class="<%="ClassName" value="4" /><br />
    </ItemTemplate><br />

Этот пример не компилируется, но я надеюсь, что вы поняли идею.

Ответы [ 4 ]

4 голосов
/ 13 октября 2010

Вы можете дать своей странице публичную переменную MyRating.

Теперь вы можете назначить переменную в привязке выражения Синтаксис:

   <ItemTemplate>
         <%# MyRating = "myrating" + <%# Eval(Container.DataItem, "Day")%>
         //Use the variable inside the binding(!) block 
         <%#MyRating
   </ItemTemplate>

Я обычно привязываюсь к спискам объектов просмотра. Таким образом, я могу получить доступ к свойствам просмотра напрямую.

   <ItemTemplate>
         <%# MyType = (MyType)Container.DataItem 
         <%# MyRating.Average %> 
         <%# MyRating.Count %> 
   </ItemTemplate>

Надеюсь, это поможет: -)

3 голосов
/ 15 июля 2009

Вы можете использовать OnItemDataBount событие и работать с DataItem как с переменной там.

1 голос
/ 13 мая 2013

Лично я считаю установку значений элементов HTML в событии OnItemDataBound более сложной, чем в коде ASP. Мне также не понравилось задавать значение переменной с помощью выражения привязки данных, так как оно, похоже, приводит к выводу значения в HTML.

Вот аналогичный способ сделать это, основываясь на других ответах:

1. Создайте защищенное поле в коде для использования в качестве переменной.

protected string className;

2. Используйте выражение привязки данных для назначения переменной.

<asp:Literal runat="server" Visible="false" Text="<%# className = "myrating" + DataBinder.Eval(Container.DataItem, "Day") %>" />

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

3. Используйте переменную внутри выражений привязки данных в коде ASP.

<ItemTemplate><br />
    <input type="radio" class="<%# className %>" value="3" /><br />
    <input type="radio" class="<%# className %>" value="4" /><br />
</ItemTemplate><br />

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

Я думаю, что основным недостатком этого подхода является использование поля, которое в идеале должно быть ограничено элементом ItemTemplate.

0 голосов
/ 29 ноября 2017

Вы можете определить общедоступные / защищенные переменные в выделенном фрагменте кода и назначить их в выражениях привязки данных.

Если у вас нет доступа к выделенному коду (например, когда вы изменяете разметку скомпилированного приложения), вы можете объявить переменные в блоке script, установленном для запуска на сервере, например ::

<script runat="server">
    YourNamespace.Rating current;
</script>

Тогда в шаблонах привязки вашего элемента управления:

<HeaderTemplate>
    <%# (current = (YourNamespace.Rating)Eval("Day")) == null ? "" : "" %>
</HeaderTemplate>

Поместите его в HeaderTemplate, если вы хотите, чтобы он выполнялся только один раз за привязку данных.
== null ? "" : "" -часть - предотвращает рендеринг любого сгенерированного html-кода (например, значение ToString назначенного значения) в браузере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...