我的页面中有一个asp占位符,我在其中动态插入"行",其中每一行都是一个用户控件。
如果请求是 GET 请求,则我从数据库加载数据并根据需要填充任意数量的用户控件。我还将控件实例添加到会话内容中。
如果请求是 POST 请求,我首先通过查看 Page_Load(( 中的会话内容来重新创建控件。之后,每个按钮的处理程序可以执行需要完成的任何额外工作,例如添加新行(添加到占位符、会话和数据库(、删除行(从占位符、会话和数据库中(或更新现有行。
我在这里面临几个问题:
- 删除行
- 时,有时删除后屏幕上会显示错误的数据,即使删除了正确的行也是如此。这很危险,因为对于进一步的删除,我们不知道哪些行会受到影响。
- 添加新行时,有时现有行中的一行中会有错误的数据(特别是来自另一个现有行的数据(
如何解决这些问题?我甚至很难诊断问题。这些是常见问题吗?我只是做错了吗?有什么更好的方法来实现这一点?
我以前遇到过这样的问题。我通过以下方式修复了它们:
- 在将用户控件放入占位符,它需要具有与回发之前相同的 ID(即您第一次创建它时(。我做类似
"usr_" + <db record id>
.这可确保无论按何种顺序,它都是相同的 ID加载,删除哪些记录等。这可能是最要做的重要事情,因为如果不分配它,ID 的 .NET 将为您分配它们 -- 它们按照它们显示的顺序分配在控件集合中,这意味着您可能拥有错误用户控件中的错误信息(您在问题(。 - 不使用会话来存储有关页面的信息。一旦 ID问题已修复,如果打开,人们仍然有问题同一页面的两个选项卡。
大致如下:
using (SqlConnection c = new SqlConnection(DB_STRING))
{
c.Open();
String sql = @"
SELECT *
FROM yourTable
ORDER BY ID;";
using (SqlCommand cmd = new SqlCommand(sql, c))
{
using (SqlDataReader d = cmd.ExecuteReader())
{
while (d.Read())
{
UserControl uc = (UserControl)new UserControl().LoadControl("~/path/to-your-control/YourControl.ascx");
uc.ID = "usr_" + d["ID"];
plcHolderRows.Controls.Add(uc);
}
}
}
}