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

mag*_*tic 12 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">
Run Code Online (Sandbox Code Playgroud)

调用Codebehind方法

public IEnumerable<Reference> GetReferences()
Run Code Online (Sandbox Code Playgroud)

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

例:

<asp:Repeater runat="server" ItemType="MyData.Reference" 
        SelectMethod="GetReferences(Item.ID)">
Run Code Online (Sandbox Code Playgroud)

应该打电话

public IEnumerable<Reference> GetReferences(int id)
Run Code Online (Sandbox Code Playgroud)

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

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

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

mag*_*tic 8

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

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

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

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

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

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


Lav*_*ter 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>
Run Code Online (Sandbox Code Playgroud)

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

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

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

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