代码之家  ›  专栏  ›  技术社区  ›  Laurence

当第二次重新绑定转发器时(页面加载中的第1次,页面Prerender中的第2次)出现重复行

  •  0
  • Laurence  · 技术社区  · 14 年前

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

    以上所有操作都是有效的,除了当问题列表在提交答案后重新弹出时,新列表包含重复的行,并且还有一行丢失,如下所示:

    原始列表:

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

    Q1
    Q2
    Q2
    Q3
    

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

    在问题列表控件的页面加载中,如果Page.IsPostBack页面我打电话是真的吗中继器.数据绑定(). 这将重新创建问题输入控件并允许其按钮单击事件触发。第一个挑战是这些事件在父控件的页加载完成后触发,但是我找到了一种方法在父控件上创建一个“ForceReload”属性,问题输入控件可以在它的button click事件中设置为True。因此,在问题列表控件的页面_PreRender中,我检查ForceReload是否为true,如果是,则调用中继器.数据绑定一秒钟。

    在第二个数据绑定中,奇怪的事情发生了。如果我逐步检查代码,我可以看到与提交的问题对应的DataItem出现了两次。但是,第二次运行的SQL查询与第一次运行的SQL查询相同,并且返回的记录也相同(即第二次的结果中没有重复项)。

    我想在第二次数据绑定之前,我需要做一些中继器“复位”,但看不到任何功能来做这件事。

    可能原因。。。。问题的唯一键在第一个数据绑定和第二个数据绑定之间变化。我知道这听起来有点古怪,但这就是数据库的工作原理——一个qiven问题在其“未回答”状态下可能有一个唯一的ID“-123”,然后在“已回答”状态下有“123”。如果我强迫身份证保持不变,问题就不会出现了。更改ID是因为数据源是一个视图而不是一个表,无论如何我对此无能为力。当转发器不知道唯一的ID是什么时,它为什么会在意呢??

    更新:经过更多的测试,这肯定是一个LINQ问题,而不是一个repeater或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)
    

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

    1 回复  |  直到 14 年前
        1
  •  0
  •   Daniel Dyson    14 年前

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

    本质上,id可能是您所建议的问题的根源。你能把暗号贴出来让你控制吗?我想看看你是如何更新数据库的。