如何将数据绑定表达式的值存储到变量中

时间:2009-07-13 21:09:47

标签: asp.net data-binding binding

我需要在模板中多次访问绑定项的值。现在我的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 个答案:

答案 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中输出。

基于其他答案,这是一种类似的方法:

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元素。

答案 3 :(得分:0)

您可以在代码隐藏中定义公共/受保护变量,并在数据绑定表达式中分配它们。

如果您无法访问代码隐藏(例如,当您修改已编译应用程序的标记时),则可以在script块中声明变量以在服务器上运行,例如:

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

然后在你控件的绑定模板中:

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

如果您只希望每次数据绑定执行一次,请将其放在HeaderTemplate== null ? "" : "" - 部分是为了防止在浏览器中呈现任何生成的残缺html(例如指定值的ToString值)。