【问题标题】:Is it possible to pass a value to the SelectMethod of a Repeater?是否可以将值传递给中继器的 SelectMethod?
【发布时间】:2012-09-30 01:41:10
【问题描述】:

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

【问题讨论】:

  • +1 好问题 - 我很感兴趣。

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


【解决方案1】:

在等待答案的过程中,我玩了一会儿,找到了以下解决方案。

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

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

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

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

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

【讨论】:

    【解决方案2】:

    这是你的做法:

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

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

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

    【讨论】:

    • 有趣。我不喜欢您生成对客户端或后续回发基本上无用的标记。
    • 您是指ItemID-控件本身吗?如果您想避免无用的标记,我会离开 WebForms 并开始查看 asp.net MVC 或使用 Knockout.js - 那么您实际上可以控制您的标记。不过,我明白你的意思。
    【解决方案3】:

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

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

    【讨论】:

    • 总的来说这听起来不错,但我不确定我是否可以将它用于我的工作案例。我将如何使用值提供者从外部转发器传递项目 ID?
    【解决方案4】:

    您可以使用价值提供者

    例子:

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

    这是一个 ValueProviders 列表:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-10
      • 1970-01-01
      • 1970-01-01
      • 2021-06-30
      • 2021-05-08
      • 2021-12-30
      • 2019-12-20
      • 2018-04-17
      相关资源
      最近更新 更多