如何在执行操作时强制用户输入自动提交和保存?

How do I force user input to commit and save automatically when executing an action?

我有一个自定义图表,在本例中称为 MyGraph。该页面包含一个表单选项卡,其方式与库存商品页面类似,其中 header 是我的 DAC (MyDAC) 的几个字段,第一个选项卡上的表单是我的附加字段的一种形式。为了便于讨论,视图是 MyView 和 MyCurrentView。

在 Stocked Items 页面上,我可以在 ItemSettings 视图(General Settings 选项卡)中设置一个值,然后执行一个操作,这也恰好保存了我的用户输入。在我的自定义页面中,类似“MyCurrentView”选项卡的用户输入在我执行操作时丢失了。我已经再次查看了 T230 Actions 的培训 material,但我似乎无法克服这个问题。下面的代码示例显示了我如何执行操作“ConvertIt”的 2 个简化方法。在调试过程中的这两种情况下,myDAC 和 myDAC2 都包含陈旧数据,表明视图未按照 Button 属性和 DataSource 回调命令中的 CommitChanges 的预期进行更新。未保存的用户输入是通过仅在 MyCurrentView 中呈现给 UI 的字段输入的。

T230 培训指南指出我应该在操作栏中设置 AutoCallBack 行为,这似乎适用于网格,但不适用于表单。培训指南中的示例是:

<ActionBar>
    <CustomItems>
        <px:PXToolBarButton Text="Complete">
            <AutoCallBack Command="Complete" Target="ds">
                <Behavior CommitChanges="True" ></Behavior>
            </AutoCallBack>
        </px:PXToolBarButton>
    </CustomItems>
</ActionBar>

由于我通过 action.AddMenuAction(convertIt); 将我的操作从操作菜单中挂起,所以我似乎无法按照描述指定行为在培训指南中。

视图已定义

public PXSelect<MyDAC> MyView;
public PXSelect<MyDAC, Where<MyDAC.tagID, Equal<Current<MyDAC.tagID>>>> MyCurrentView;

操作定义 - 方法 1

#region convertIt Action
public PXAction<MyDAC> convertIt;
[PXUIField(DisplayName = "My DAC Label", MapEnableRights = PXCacheRights.Update, MapViewRights = PXCacheRights.Select)]
[PXButton(CommitChanges = true)]
public virtual void ConvertIt()
{

    this.Save.Press();   // Seems to make no difference in saving the unsaved user entry

    MyDAC myDAC = MyView.Current;
    MyDAC myDAC2 = MyCurrentView.Current;

    ** DO THE WORK OF THE ACTION HERE **

}
#endregion

操作定义 - 方法 2

#region convertIt Action
public PXAction<MyDAC> convertIt;
[PXUIField(DisplayName = "My DAC Label", MapEnableRights = PXCacheRights.Update, MapViewRights = PXCacheRights.Select)]
[PXButton(CommitChanges = true)]
public virtual IEnumerable ConvertIt(PXAdapter adapter)
{

    MyDAC myDAC = MyView.Current;
    MyDAC myDAC2 = MyCurrentView.Current;

    ** DO THE WORK OF THE ACTION HERE **

    return adapter.Get();
}
#endregion

ASPX 数据源已定义

<px:PXDataSource ID="ds" runat="server" Visible="True" Width="100%"
    TypeName="MyGraph"
    PrimaryView="MyView">
    <CallbackCommands>
        <px:PXDSCallbackCommand CommitChanges="True" Name="ConvertIt" ></px:PXDSCallbackCommand>
    </CallbackCommands>
</px:PXDataSource>

简而言之,当我完成我的操作时,用户输入丢失了。我尝试在操作开始时包含 this.Save.Press(),但我已经在操作结束时保存了。无论如何,调试不会在视图中显示我的用户输入的值,尽管我希望按钮和数据源中的提交更改能够在继续操作之前从客户端提交这些更改。

我在 C# 代码或 ASPX 页面定义中遗漏了什么阻止应用我的 UI 更新?有趣的是,UI 应用了 MyView 视图中的更改,但没有应用 MyCurrentView 中的更改,除非我在从菜单中选择操作之前手动按下保存按钮。

我最近也运行遇到了这个问题。当打开智能面板关闭操作时,很容易强制页面 post 返回服务器,但如果没有打开面板,你如何强制 post 在字段中更改的数据不承诺更新? 我发现完成此操作的唯一方法是编辑 ASPX 并将 StartNewGroup="true" 和 CommitChanges="true" 添加到 PXDSCallbackCommand 以获取操作添加到的操作文件夹。

<px:PXDataSource ID="ds" runat="server" Visible="True" Width="100%"
    TypeName="MyGraph"
    PrimaryView="MyView">
    <CallbackCommands>
        <px:PXDSCallbackCommand CommitChanges="True" Name="ActionFolder" StartNewGroup="True" />
    </CallbackCommands>
</px:PXDataSource>

对于动作,你应该使用第二种方法。

public PXAction<MyDAC> convertIt;
[PXUIField(DisplayName = "My DAC Label", MapEnableRights = PXCacheRights.Update, MapViewRights = PXCacheRights.Select)]
[PXButton(CommitChanges = true)]
public virtual IEnumerable ConvertIt(PXAdapter adapter)
{
    MyDAC myDAC = MyView.Current;
    MyDAC myDAC2 = MyCurrentView.Current;

    **DO THE WORK OF THE ACTION HERE **
        
    return adapter.Get();
}

public MyGraph()
{
    actionFolder.AddMenuAction(convertIt);
}

无法保存焦点字段值。当控件失去焦点时保存值。但是,当焦点从未提交的字段转到操作按钮(用户单击)时,当前字段值将丢失。不确定这是这里的问题,但请记住,在单击操作按钮之前,用户必须使用未提交的值退出控件编辑器,否则该值将丢失。