jquery对话框显示以前的ajax请求中的数据

在我的MVC应用程序中,我面临着jquery对话框的非常奇怪的问题。 我正在为这个应用程序使用多级对话框; 其中在第一级对话框中将有jqGrid显示记录并提供链接列来操纵第二级对话框中的记录。

可以使用jqGrid中的链接列打开包含操作数据的小表单的对话框。 单击链接时,预填充此表单数据存在问题; &以随机时间间隔发生。 当我打开此表单以编辑来自jqGrid的任何记录时,预先填充的数据来自先前打开的记录以进行编辑。 然后,如果关闭此对话框并尝试打开相同的记录进行第二次编辑,它将显示正确的预填充数据。 一旦出现这个问题,那么在此之后继续存在直到我们在浏览器中刷新基页。 如果我检查当前ajax调用收到的响应,使用firebug以对话框forms加载数据; 我看到从服务器返回的数据是正确的,但是表单中显示的数据是错误的,这是来自之前打开的jqGrid记录。 你可以在下面的截图中看到这一点

请看下面的截图 在此处输入图像描述

在最顶层对话框后面的网格中,具有编辑图标的最后一列是链接列,用于打开具有问题forms的顶部对话框。 此列包含数据以及[可能是日期或文本] ,这些数据将作为参数进行编辑发送到打开的表单。 从图中可以看出,网格中选择的第二条记录的日期为2013年11月26日, 我通过单击相应链接生成的ajax请求获得的html响应是根据function 。 但是打开的对话框显示了当前编辑之前编辑的第一条记录的日期。

这是一种数据缓存问题; 我尝试在相应的第一级和第二级弹出视图中包含以下元标记

   

我认为问题得到了解决; 但事实并非如此。 根据我的观察它刚刚减少了这个问题的发生频率不确定

我希望这个描述足够清楚,可以理解这个问题。

如果不查看代码并且没有调试问题,很难找到所描述问题的原因。 所以我试着猜。

首先,我严格建议您使用always recreateForm: true表单编辑的recreateForm: true选项。 不使用选项jqGrid隐藏关闭时的编辑对话框,并在下一次编辑时显示回来。 jqGrid重新填充表单的字段,但是在使用recreateForm: true的情况下recreateForm: true jqGrid每次都重新创建完整的编辑对话框。

下一个可能的问题可能是页面上的id重复。 jqGrid在每个jqGrid行和编辑表单的每一列上设置id属性。 如果页面上有多个网格,则可能使用数据库中的本机ID。 问题是数据库表中的本机ID仅在一个表内是唯一的。 如果显示来自不同表的信息,则ID可以相同。 另一个示例是在第二个网格上显示具有基于信息的网格和详细信息。 在这种情况下,同样的id也可以使用两次。 所以我建议你在每个网格中使用idPrefix选项。 例如,如果你在一个网格中使用idPrefix: "a"在另一个网格中使用idPrefix: "b" ,那么从服务器返回的id 1将被分配为第一个网格中的rowid "a1"和作为rowid "b1"的第二个网格。 如果行编辑的结果将被发送回服务器,则将删除id前缀,服务器将看到原始id=1

id复制的另一个可能来源是编辑表单的字段。 编辑表单字段的id使用与列名相同的id。 因此,如果您在两个网格中具有相同name属性的页面上有更多网格,则可以使用id重复项。 所以建议:对所有网格使用唯一的name属性。 如果使用repeatitems: false (输入数据中的命名字段),则可以使用jsonmap属性,该属性对应于JSON输入数据的字段,并使用网格中任何列的自由name值。 通过这种方式,您可以轻松地在colModel构建具有唯一name的网colModel 。 我希望你理解我建议的结构。

我建议你首先尝试使用recreateForm: true选项添加该行

 $.extend($.jgrid.edit, {recreateForm: true}); 

在代码的开头。 它会将recreateForm默认值设置为true 。 之后你应该重复测试。

它设置的recreateForm: true将无法解决您可以包含idPrefix的问题,其中包含唯一值( "a""b""c" ,…或"g1_""g2_""g3_" ,… )。 之后你应该重复测试。 在colModel中创建唯一name ,只有在前一步骤失败时才能在最后一步进行。