12

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 中的外部中继器项中获取值?

4

4 回答 4

9

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

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

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

基本上我在这里所做的就是用替换SelectMethodDataSourceIntellisense 不会建议它,但它仍然有效)。

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

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

于 2012-10-09T18:57:22.680 回答
6

这是您的操作方法:

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

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

我找到了你的问题,按照你的做法做了,然后我尝试了这个解决方案,它同样有效,但看起来更干净,更符合概念的想法。

于 2013-02-15T13:31:47.057 回答
2

查看练习 1:ASP.NET Web 窗体中的模型绑定 -> 任务 3 - 模型绑定中的值提供程序教程。

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

于 2012-10-09T18:15:47.833 回答
1

您可以使用价值提供者

例子:

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

这是 ValueProviders 的列表:

于 2012-10-09T18:36:37.677 回答