Asp.net 如何以声明方式将“SelectedValue”绑定到数据源字段?
我想驱动RadioButtonLists SelectedValue属性从数据源中的属性,但我无法使其工作Asp.net 如何以声明方式将“SelectedValue”绑定到数据源字段?,asp.net,data-binding,webforms,Asp.net,Data Binding,Webforms,我想驱动RadioButtonLists SelectedValue属性从数据源中的属性,但我无法使其工作 我有一个我通过扩展原始RadioButtonList控件并修改核心数据绑定方法来支持ListItem对象,从而实现了无缝工作,而不需要在codebehind中手动分配 事情是这样的: public class MyRadioButtonList : RadioButtonList { protected override void PerformDataBinding(IEnume
我有一个我通过扩展原始RadioButtonList控件并修改核心数据绑定方法来支持ListItem对象,从而实现了无缝工作,而不需要在codebehind中手动分配 事情是这样的:
public class MyRadioButtonList : RadioButtonList
{
protected override void PerformDataBinding(IEnumerable dataSource)
{
if (dataSource is IEnumerable<ListItem> listItems)
{
...
foreach (var listItem in listItems)
Items.Add(listItem);
...
}
else
{
base.PerformDataBinding(dataSource);
}
}
}
有了它,只需将源模型转换为表示层上的IEnumerable,通过适配器/代理实现即可轻松完成,然后将这些ListItems提供给控件
一旦我准备好了,我就可以根据datasource字段在UI中正确地看到我选择的项目。考虑到扩展是多么微不足道,我觉得它非常值得:
同样的继承方法也可能用于类似的控件,如CheckBoxList,它也有同样的限制
对于更具冒险精神的人,也可以通过在控件中引入额外的DataSelectedField和DataEnabledField属性,并在其上使用Eval作为原始数据绑定算法的一部分来实现这一点,该算法已经对DataTextField和DataValueField执行了这一操作。我觉得这对于我的用例来说会有点复杂,并决定使用一种更简单的覆盖,但这绝对是一种有效的方法,甚至可以与我提出的解决方案一起使用,以获得更强大的RadioButtonList。非常确定,您必须使用代码隐藏,设置选定的索引或选定的值。SelectedValue不是asp:RadioButtonList控件的有效属性。@wazz SelectedValue绝对有效,只是在intellisense中不显示。我收到一个错误:“SelectedValue”属性不能以声明方式设置。您能在看到@wazz的地方共享一段代码吗?我以前从未见过此错误消息,我只是仔细检查了我的实际生产代码,我可以向您保证RadioButtonList有一个SelectedValue,并且您应该能够以声明方式设置它。@wazz,仅供参考我找到了解决此问题的方法并将其添加为答案。
public static class ItemProvider
{
public static CollectionWithDefault GetAvailableItems()
{
var items = new [] { "option1", "option2", "option3" };
return new CollectionWithDefault(items, items[1]);
}
}
<asp:ObjectDataSource runat="server"
ID="ItemSource"
TypeName="MyNamespace.ItemProvider"
SelectMethod="GetAvailableItems" />
<asp:RadioButtonList runat="server"
DataSourceID="ItemSource"
SelectedValue='<%# Eval("DefaultItem") #>' />
public class MyRadioButtonList : RadioButtonList
{
protected override void PerformDataBinding(IEnumerable dataSource)
{
if (dataSource is IEnumerable<ListItem> listItems)
{
...
foreach (var listItem in listItems)
Items.Add(listItem);
...
}
else
{
base.PerformDataBinding(dataSource);
}
}
}