我需要在模板中多次访问绑定项的值。现在我的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 />
这个例子没有编译,但我希望你能得到这个想法。
答案 0 :(得分:4)
您可以为您的页面提供一个公共变量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>
希望这会有所帮助: - )
答案 1 :(得分:3)
您可以使用OnItemDataBount
事件并使用DataItem作为变量。
答案 2 :(得分:1)
我个人认为在OnItemDataBound
事件中设置HTML元素值比在ASP代码中更加混乱。我也不喜欢使用数据绑定表达式设置变量值,因为它似乎导致值在HTML中输出。
基于其他答案,这是一种类似的方法:
protected string className;
<asp:Literal runat="server" Visible="false" Text="<%# className = "myrating" + DataBinder.Eval(Container.DataItem, "Day") %>" />
确保在隐藏的服务器端标记内执行此操作,以便表达式的结果不会出现在生成的HTML中。
<ItemTemplate><br />
<input type="radio" class="<%# className %>" value="3" /><br />
<input type="radio" class="<%# className %>" value="4" /><br />
</ItemTemplate><br />
确保使用数据绑定表达式来访问变量。其他表达式类型似乎只能看到变量的默认值。
我认为这种方法的主要缺点是使用了字段,理想情况下该字段应限定为ItemTemplate
元素。
答案 3 :(得分:0)
您可以在代码隐藏中定义公共/受保护变量,并在数据绑定表达式中分配它们。
如果您无法访问代码隐藏(例如,当您修改已编译应用程序的标记时),则可以在script
块中声明变量以在服务器上运行,例如:
<script runat="server">
YourNamespace.Rating current;
</script>
然后在你控件的绑定模板中:
<HeaderTemplate>
<%# (current = (YourNamespace.Rating)Eval("Day")) == null ? "" : "" %>
</HeaderTemplate>
如果您只希望每次数据绑定执行一次,请将其放在HeaderTemplate
中
== null ? "" : ""
- 部分是为了防止在浏览器中呈现任何生成的残缺html(例如指定值的ToString
值)。