具有一些条件的数组的Eval

时间:2011-04-14 10:47:37

标签: asp.net

如何在ASP.NET WebPAge中使用Eval作为数组?

我想写一些像<%# Eval(Images.First().SmallImageUrl) %>

的东西
<%# Eval(Images.SingleOrDefault(x => x.IsMainIMage).SmallImageUrl) %>

以下是代码示例:

<asp:Repeater ID="GoodsRepeater" runat="server">

              <HeaderTemplate>
              </HeaderTemplate>

              <ItemTemplate>

               <div class="<%# (Container.ItemIndex % 2)!=0 ? "GoodItemTdEven" : "GoodItemTdOdd" %>">   

                 <asp:Image ID="Image1" ImageUrl='<%# "/" + Eval("GoodsImages.First().SmallImageUrl") %>' AlternateText='<%# Eval("Name") %>'  runat="server" />

                 <div class="GoodItemDescriptionDiv" >

                   <asp:HyperLink CssClass="GoodItemNameText"  NavigateUrl='<%# "~/Pages/Main/Catalog.aspx?productId=" +  Eval("Id") %>' Text='<%# Eval("Name") %>' runat="server" />
                   <%--<span class="GoodItemNameText">  <%# Eval("Name") %> </span> <br /> <br />--%>
                   <span class="GoodItemDescriptionText" > <%# Eval("Description") %> </span> 
                   <br />

                 </div>


                </div>

              </ItemTemplate>

              <FooterTemplate>
              </FooterTemplate>

          </asp:Repeater>

我有一个例外'DataBinding:'First()'不是有效的索引表达式。'

2 个答案:

答案 0 :(得分:5)

为什么不在代码隐藏中创建一个帮助方法来获取此值?它可以使你的标记更清晰:

<%# GetImageUrl((YourImagesType)Eval("Images")) %>

然后在代码隐藏中:

protected static string GetImageUrl(YourImagesType images)
{
    return images
        .Where(x => x.IsMainIMage)
        .Select(x => x.SmallImageUrl)
        .FirstOrDefault();
}

答案 1 :(得分:3)

Eval使用反射(或对已知类型(如数据表/视图)进行索引) - 我建议您使用Container.DataItem上的实际表达式 - 例如

<asp:Image ID="Image1" ImageUrl='<%# "/" + (([your object type])Container.DataItem).GoodsImages[0].SmallImageUrl %>' AlternateText=...

这假设您将转发器绑定到[your object type]的集合,并且该类型的方法名为GoodsImages,返回一个数组。

请注意,如果您希望使用First等扩展方法,则编译器仅在您要导入的名称空间中查找它们。因此,您需要再次使用@Import指令或Extension类,即Enumerable.First(...