自定义Dialog的OK按钮命令未触发问题求助
我制作了一个带数据字段和OK按钮的自定义Dialog,期望OK按钮能执行字段保存及其他处理逻辑,但目前该按钮仅会关闭对话框,完全没触发关联代码。
我在页面编辑器中定义了这个新Dialog,通过菜单按钮的命令委托方法和视图的AskExt()方法可以正常打开Dialog。但我在AskExt返回结果后设置了断点:
if (view.AskExt("viewPanel", true) == WebDialogResult.OK) { // 此处为添加了断点的业务代码 } else { // 此处为添加了断点的业务代码 }
断点完全没触发;同时我尝试将Dialog按钮的AutoCallback命令绑定到自定义方法(试过匹配按钮委托的protected void()和public IEnumerable(PXAdapter)两种签名),方法内的断点也同样没触发。
我推测是遗漏了某个简单的配置项,试过多种组合仍未解决,特此向社区求助。
OK按钮配置说明:DialogResult设为OK,配置了AutoCallback,命令为readMeSave,目标数据源为ds,PostData和CommitChanges均设为True。
[2023年7月16日更新]:以下是我的ASPX代码,PXFormView的DataMember与PXSmartPanel的Key保持一致:
<px:PXSmartPanel runat="server" ID="PanelReadMe" Caption="read.me" CaptionVisible="True" LoadOnDemand="True" AllowResize="True" HideAfterAction="True" AcceptButtonID="btnSave" CancelButtonID="btnCancel" CloseButtonDialogResult="Cancel" Width="1100" Height="575" AutoRepaint="True" AutoReload="True" Key="ReadMeProject" AutoCallBack-Enabled="True" AutoCallBack-Target="frmReadMeDlg" AutoCallBack-Command="ReadMeSave" AutoCallBack-Behavior-CommitChanges="True" AutoCallBack-Behavior-PostData="Page"> <px:PXFormView runat="server" ID="frmReadMeDlg" DataMember="ReadMeProject" Caption="Read.Me" CaptionVisible="False" DataSourceID="ds" NoteIndicator="False" ActivityIndicator="False" Width="1100" Height="550"> <Template> <px:PXSelector runat="server" ID="CstPXSelector24" DataField="Name" Enabled="False" /> <px:PXTextEdit runat="server" ID="CstPXTextEdit26" DataField="Description" Enabled="False" /> <px:PXRichTextEdit runat="server" DataField="UsrReadMe" ID="edReadMe" Height="600" Width="1100"> <AutoSize Container="Parent" Enabled="True" MinHeight="500" MinWidth="950" /> </px:PXRichTextEdit> <px:PXLayoutRule runat="server" ID="CstPXLayoutRule8" StartRow="True" /> <px:PXPanel runat="server" ID="PanelButtons" SkinID="Buttons"> <px:PXButton runat="server" ID="PanelButtonsOK" DialogResult="OK" Text="OK" PopupPanel="PanelReadMe"> <AutoCallBack Command="readMeSave" Target="ds" ActiveBehavior="True" Enabled="True"> <Behavior PostData="Page" CommitChanges="True" /> </AutoCallBack> </px:PXButton> <px:PXButton runat="server" ID="PanelButtonsCancel" Text="Cancel" DialogResult="Cancel" PopupPanel="PanelReadMe"> <AutoCallBack Command="readMeCancel" Enabled="True" Target="ds" /> </px:PXButton> </px:PXPanel> </Template> <AutoSize Container="Parent" /> </px:PXFormView> </px:PXSmartPanel>
问题排查与解决方案
1. 命令名称大小写不匹配
ASPX中按钮的AutoCallback命令是readMeSave(小驼峰),但PXSmartPanel上的AutoCallBack-Command是ReadMeSave(大驼峰)——Acumatica的命令名称严格区分大小写,必须完全一致。统一改成相同命名,比如都用ReadMeSave。
2. AskExt的异步逻辑冲突
当Dialog按钮配置了AutoCallback时,AskExt不会同步返回结果——因为AutoCallback是异步回发,此时AskExt后续的代码块根本不会执行。所有业务逻辑必须放在回调命令对应的处理方法中,而不是AskExt的判断分支里。
3. DialogResult与AutoCallback的冲突
同时设置DialogResult="OK"和AutoCallback会导致弹窗直接关闭,回调逻辑还没执行就被终止。解决方法:
- 去掉按钮的
DialogResult="OK"配置 - 在回调方法执行完业务逻辑后,通过代码控制弹窗关闭(或者依赖PXSmartPanel的
HideAfterAction="True"自动关闭)
示例回调方法:
public IEnumerable ReadMeSave(PXAdapter adapter) { // 执行字段保存和自定义业务逻辑 var readMeRow = Base.ReadMeProject.Current; if (readMeRow != null) { // 保存操作或其他处理 Base.ReadMeProject.Update(readMeRow); Base.Actions.PressSave(); } // 若未设置HideAfterAction="True",手动关闭弹窗 // PanelReadMe.Hide(); return adapter.Get(); }
4. 回调方法签名必须正确
必须使用public IEnumerable 方法名(PXAdapter adapter)的签名,且方法名要和ASPX中的Command名称完全匹配(包括大小写)。protected void类型的签名无法被Acumatica的AutoCallback机制识别。
5. 检查PXSmartPanel的配置
当前PXSmartPanel设置了HideAfterAction="True",这个属性会在回调命令执行完成后自动隐藏弹窗,无需手动调用Hide(),但前提是回调命令能正常触发。
内容的提问来源于stack exchange,提问作者Tony Lanzer

