我有一个DropDownList
控件,通过SqlDataSource
数据绑定,其查询返回3个字段(Label
,Value
和Active
) - 是否存在以编程方式访问数据绑定数据集以检查Active
标志是真还是假的方法?
我知道这可以在数据绑定期间完成,但我需要在Active
阶段检查PreRender
标志,因为控件可能需要选择一个值Active=false
如果加载已做出此选择的旧记录。 (在PreRender
期间,我删除了所有Active=false
项,除非它是我将DropDownList
设置为的值。
我通过使用DataView
填充SqlDataSource
来完美地完成此操作。选择并比较/删除基于此的项目,但是为了每个控件第二次访问数据库两次,这似乎是低效的。
另外,我无法为所有控件编写一段可重用/通用代码,因为我的当前方法仅在SqlDataSource
不需要任何SelectArguments
时才有效。如果我可以直接访问数据绑定数据,这也可以绕过这个问题。
非常感谢任何建议!
答案 0 :(得分:2)
我认为您遇到的主要问题来自于使用SqlDataSource作为数据访问。 SqlDataSources易于设置并为您提供即时结果,但它们非常不灵活,需要跨页面重用。
我会创建一个从数据库中获取数据并将其存储在List或IEnumerable中的函数。如果数据在List中,那么您可以以编程方式访问它,并且验证更容易实现。
以下是使用实体框架访问数据库的示例
标记
<asp:DropDownList ID="ddlTest" runat="server"></asp>
代码背后
public List<Record> GetAllRecordsByUserName(string credentials)
{
List<Record> recordList;
using (CustomEntities context = new CustomEntities())
{
IQueryable<Record> recordQuery = from records in context.Records
where records.UserName == credentials
select records;
recordList = recordQuery.ToList<Record>();
}
return recordList;
}
public void ValidateAndBind(string username)
{
List<Record> recordList = GetAllRecordsByUserName(username);
// Do validation here
ddlTest.DataSource = recordList;
ddlTest.DataBind();
}
protected void Page_Load(object sender, EventArgs e)
{
ValidateAndBind("test.username");
}
您可以使用您想要的任何数据访问方法,但以编程方式设置它允许您跨页面重复使用它。在上面的方法中,我在页面中为空间条件创建了它。实际上,您应该创建一个处理特定数据检索的类,通常称为数据访问层。