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