You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义Dialog的OK按钮命令未触发问题求助

自定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 15:57:23