能否将一个值传递给Repeater的SelectMethod方法?

12

ASP.Net 4.5的新特性是通过SelectMethod属性,为像Repeater这样的控件提供了新的数据绑定方式:

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

调用Codebehind方法

public IEnumerable<Reference> GetReferences()
在嵌套的重复器场景中,是否可以以某种方式传递参数到此选择方法,以便根据外部重复器的项获取不同的数据?
示例:
<asp:Repeater runat="server" ItemType="MyData.Reference" 
        SelectMethod="GetReferences(Item.ID)">

应该调用

public IEnumerable<Reference> GetReferences(int id)
我知道可以通过ItemDataBound事件实现这一点,但我想使用更简单和更干净的SelectMethod和ItemType语法。
SelectMethod是否允许以某种方式进行参数传递?
如果不行,是否有其他干净的方法可以从外部重复项中获取值?

1
+1,好问题 - 我很感兴趣。 - JonH
5个回答

9

在等待答案的同时,我尝试了一下并找到了以下解决方案。

这可能不是最好的方法,但目前我没有发现任何问题,而且它非常直观,所以我会分享给大家。

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

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

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

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


6

以下是具体操作:

在您的外层重复器中,放置一个隐藏字段,并为内部重复器命名一个selectmethod:

<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”时非常有用。

我看到了你的问题,并像你一样尝试了一下,然后我尝试了这个解决方案,它同样有效,而且更加干净,更符合概念的思想。


有趣。但是我不喜欢你生成的标记对客户端或后续回发来说基本上是无用的。 - magnattic
你是指ItemID控件本身吗?如果你想避免无用的标记,我建议你远离WebForms并开始使用asp.net MVC或使用Knockout.js - 这样你就可以真正掌控你的标记。不过我明白你的意思。 - LavaEater

2

这个听起来总体不错,但我不确定我能在我的工作案例中使用它。我该如何使用值提供程序来传递外部重复器中的项目ID? - magnattic

1

你可以使用值提供者

示例:

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

这是一个ValueProviders列表:



网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接