是否可以将值传递给Repeater的SelectMethod?

时间:2012-10-09 17:01:16

标签: c# asp.net data-binding repeater asp.net-4.5

ASP.Net 4.5引入了通过SelectMethod属性将数据绑定到Repeater等控件的新方法:

<asp:Repeater runat="server" ItemType="MyData.Reference" 
      SelectMethod="GetReferences">

调用Codebehind方法

public IEnumerable<Reference> GetReferences()

在嵌套转发器的场景中,是否可以以某种方式将参数传递给此select方法,以便根据外部转发器的Item获取不同的数据?

示例:

<asp:Repeater runat="server" ItemType="MyData.Reference" 
        SelectMethod="GetReferences(Item.ID)">

应该致电

public IEnumerable<Reference> GetReferences(int id)

我知道这可以通过ItemDataBound事件来实现,但我想使用SelectMethod和ItemType更简单,更简洁的语法。

SelectMethod是否允许参数以某种方式传递?

如果没有,是否有另一种干净的方法从我的SelectMethod中获取外部Repeater项的值?

4 个答案:

答案 0 :(得分:8)

在等待答案时,我玩了一下,找到了以下解决方案。

这可能不是最好的方法,但到目前为止,我发现它没有任何问题,而且非常简单,所以我只是把它扔出去。

<asp:Repeater runat="server" ItemType="MyData.Reference" 
     DataSource='<%# GetReferences(Item.ID) %>'>

基本上我在这里做的是用SelectMethod替换DataSource(Intellisense不会建议它,但它仍然有用)。

这样我可以将值传递给GetReferences方法,然后使用返回值进行模型绑定。

到目前为止,这是我遇到的最短解决方案。

答案 1 :(得分:5)

以下是您的操作方法:

在外部中继器中,放置一个隐藏字段,并为内部中继器命名一个选择方法:

<asp:Repeater SelectMethod="GetTopLevelStuff">
   <ItemTemplate>       
       <asp:HiddenField runat="server" ID="ItemId" Value="<%# Item.ID %>"/>
       <asp:Repeater SelectMethod="GetSubItems">
           <ItemTemplate>Template code for sub-items here</ItemTemplate
       </asp:Repeater>
   </ItemTemplate
</asp:Repeater>

然后,这是一个记录不太好的魔术:

 public IQueryable<SubItem> GetSubItems([Control("ItemId")] int itemId)
    {
        return yourDataStore.GetSubItems(itemId);
    } 

在这种情况下,valueprovider也可以使用属性名,在使用列表框获取“SelectedValue”时非常有用。

我找到了你的问题,按照你的方式做了,然后我尝试了这个解决方案,但效果更好,但更清晰,更符合概念的想法,似乎。

答案 2 :(得分:2)

查看Exercise 1: Model Binding in ASP.NET Web Forms -> Task 3 – Value Providers in Model Binding教程。

可以在SelectMethod签名中定义某种控制选择参数。

答案 3 :(得分:1)

您可以使用价值提供商

示例:

public IQueryable<Category> GetCategories([Control]int? minProductsCount)
{
}

这是ValueProviders的列表: