第二次重新绑定Repeater时(Page_Load中的第1个,Page_Prerender中的第2个)出现重复行

时间:2010-07-11 16:34:29

标签: .net linq linqdatasource

我设计了一个用户控件来向用户显示问题列表。这个“问题列表”控件只包含一个转发器。必须使用各种类型的问题和表单字段来回答问题,因此它们被实现为一系列“问题输入”控件,这些控件被动态加载到ItemTemplate中。每个问题输入控件都包含一个按钮,用于提交该问题的答案。提交的答案通常会更改问题列表,因此在提交任何答案并保存到数据库后,我希望问题列表能够反弹。

以上所有方法都有效,除了在提交答案后问题列表被反弹时,新列表包含重复的行,并且还会丢失一行,如下所示:

原始列表:

Q1
Q2 <---- Save button clicked on this question
Q3
Q4

新列表(Q2重复且Q4缺失):

Q1
Q2
Q2
Q3

我在动态加载的问题输入控件上提交答案以重新绑定问题列表的方式是这样的:

在问题列表控件的Page_Load中,如果Page.IsPostBack为true,我调用Repeater.DataBind()。这将重新创建问题输入控件并让其按钮单击事件触发。第一个挑战是这些事件在父控件的Page_Load完成后触发了这一事实,但我找到了一种在父控件上创建“ForceReload”属性的方法,问题输入控件可以在其按钮单击事件中设置为True。因此,在问题列表控件的Page_PreRender中,我检查ForceReload是否为真,如果是,则再次调用Repeater.DataBind()。

在这第二个数据绑定中发生了陌生感。如果我单步执行代码,我可以看到对应于两次提交的问题的DataItem。但是,第二次运行的SQL查询与第一次运行的SQL查询相同,返回的记录是相同的(即第二次结果中没有重复)。

我想我需要在第二次数据绑定之前做某种转发器“重置”,但是看不到任何执行此功能的功能。

可能的原因....问题的唯一键在第一个数据绑定和第二个之间发生变化。我知道这听起来很奇怪,但这就是数据库的工作方式 - 一个qiven问题可能在其“未应答”状态下具有唯一ID“-123”,然后在“已应答”状态下具有“123”。如果我强制ID到staty相同的问题不会出现。更改ID与数据源是视图而不是表格的事实有关,无论如何我无法做任何事情。当转发器不知道唯一的ID是什么时,为什么转发器会关心?

更新:经过更多测试,它肯定是一个LINQ问题而不是转发器或SQL问题。这是一个简单的例子:

第一次装订时检索的数据:

QuestionID   QuestionNumber    Answer
----------   --------------    ------
-1           1                 null
-2           2                 null
-3           3                 null
-4           4                 null

然后提交问题#2,列出反弹。在第二次绑定中检索的数据:

QuestionID   QuestionNumber    Answer
----------   --------------    ------
-1           1                 null
2            2                 My answer
-3           3                 null
-4           4                 null

所以数据完全正确。然而,LINQ将其转换为具有以下属性的4个对象:

QuestionID   QuestionNumber    Answer
----------   --------------    ------
-1 (OK)      1 (OK)            null (OK)
2  (OK)      2 (OK)            My answer (OK)
-3 (OK)      2 (wrong)         My answer (wrong)
-4 (OK)      3 (wrong)         null (OK)

因此,在每个对象中,键属性(QuestionID)是正确的,但是在更新的问题之后的对象中,其他属性是从前一个记录中提取的!

1 个答案:

答案 0 :(得分:0)

首先,设计数据库的人在更新或回答时更改记录的唯一ID属于另一个行业。我建议他们成为一名幻想作家或quatumn物理学家,但如果他们尝试后者,他们最终可能会试图立即将记录保存在三个州。他们可能会争辩说-123和123是同一个id的不同状态,但它们是错误的。它们是不同的数字,并且被我所知道的每个计算机系统都视为这样。他们应该有一个名为IsAnswered的布尔标志或其他东西。但是你说你不能改变这个,所以我需要更多的信息来回答你的问题。

基本上,id可能是你提出的问题的根源。你可以为你的控件发布代码吗?我想看看你如何更新数据库。