是否可以将值传递给中继器的SelectMethod



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

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

调用Codebehin方法

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是否允许以某种方式传递参数?

如果没有,是否有其他干净的方法可以从我的SelectMethod中的外部Repeater项中获取值?

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

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

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

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

通过这种方式,我可以将一个值传递给GetReferences方法,然后将返回值用于模型绑定。

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

以下是您的操作方法:

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

<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也可以使用propertyname,这在使用列表框获取"SelectedValue"时非常有用。

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

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

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

您可以使用价值提供商

示例:

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

这是ValueProviders:的列表

  • CompositeValueProvider。表示值提供程序,其值来自实现IEnumerable接口的值提供程序列表。

  • QueryStringValueProvider表示NameValueCollection对象中包含的查询字符串的值提供程序。

  • RouteDataValueProvider表示包含在实现IDictionary(Of TKey, TValue)接口的对象中的路由数据的值提供程序。

  • ControlValueProvider表示控件值的值提供程序。

  • CookieValueProvider表示cookie值的值提供程序。

  • FormValueProvider表示表单值的值提供程序。

  • ProfileValueProvider表示配置文件值的值提供程序。

  • UserProfileValueProvider表示用户配置文件的值提供程序。

  • ViewStateValueProvider表示视图状态值的值提供程序。

我认为SelectArguments属性的存在正是为了这个目的:https://learn.microsoft.com/en-us/dotnet/api/system.web.ui.webcontrols.repeater.selectarguments?view=netframework-4.8.1

最新更新