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
,只有在前一步骤失败时才能在最后一步进行。