【问题标题】:jquery dialog shows data from previous ajax requestjquery 对话框显示来自先前 ajax 请求的数据
【发布时间】:2026-01-05 00:25:01
【问题描述】:

在我的 MVC 应用程序中,我遇到了一个非常奇怪的 jquery 对话框问题。我在用 此应用程序的多级对话框;其中在第一级对话框中将有 jqGrid 显示记录并提供链接列以在第二级对话框中操作记录。

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

请看下面的截图

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

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

<meta http-equiv='cache-control' content='no-cache'>
<meta http-equiv='expires' content='0'>
<meta http-equiv='pragma' content='no-cache'>

我认为问题已解决;但事实并非如此。 根据我的观察,它只是降低了此问题的发生频率不确定

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

【问题讨论】:

    标签: javascript jquery asp.net-mvc-4 jqgrid popup


    【解决方案1】:

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

    首先,我强烈建议您始终使用recreateForm: true 表单编辑选项。不使用选项 jqGrid 在关闭时隐藏编辑对话框并在下次编辑时将其显示回来。 jqGrid 重新填充表单的字段,但在使用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(输入数据中的命名字段),那么你可以使用jqGrid的jsonmap属性,它对应于JSON输入数据的字段,并使用any免费的name列值在网格中。通过这种方式,您可以轻松地在colModel 中构建具有唯一name 的网格。我希望你能理解我建议的结构。

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

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

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

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

    【讨论】:

    • 嗨奥莱格,感谢您的重播。我希望您在表单上简要介绍一下 jqgrid 的使用情况。我刚刚使用 jqGrid 来显示记录。 & 对于最后一列,我使用了格式化程序选项,使用该选项我在最后一列中创建超链接,单击其打开单独的 jquery 对话框。我没有在构建网格编辑功能中使用。
    • @Shaggy:您可以在 * 上“关于我”信息的末尾找到 ma 电子邮件:oleg.kiriljuk@ok-soft-gmbh.com。您可以尝试调用 jQuery UI Dialog 的 "destroy" 方法,然后调用 jQuery remove 以删除对话框使用的&lt;div&gt;(参见here)。我希望在第二次打开对话框后能像第一次一样工作。
    最近更新 更多