页面加载后,Acumatica ERP 按条件重定向
Acumatica ERP redirect by condition after the page has been loaded
在某些情况下打开第一个页面时,是否有任何方法可以从一个自定义页面重定向到另一个自定义页面?
我已尝试将 PXRedirectByScreenIDException
与 RowSelected
事件一起使用,但未处理异常且重定向无效。
protected void PrimaryView_RowSelected(PXCache sender,PXRowSelectedEventArgs e)
{
if(some_expression)
{
throw new PXRedirectByScreenIDException("II999999", PXBaseRedirectException.WindowMode.Base, true);
}
}
许多 Acumatica 功能只能在狭窄范围内工作。我注意到 Redirection Exception
在 Action Event Handler
的上下文中执行时总是有效。据推测,在执行这些处理程序时,框架将调用包装在一个 catch 块周围,该块专门捕获那些重定向异常类型并执行重定向。在其他情况下,它可能不会捕获此特定类型,并导致部分未处理的异常。
所以我在页面加载时重定向的想法是在操作事件处理程序中抛出重定向异常。该操作需要从 UI 上下文中调用,否则它仍将未处理。所以我将使用 JavaScript 在页面加载时从 UI 调用操作。
在操作事件处理程序的上下文中抛出重定向异常的图形扩展:
public class SOOrderEntry_Extension : PXGraphExtension<SOOrderEntry>
{
public PXAction<SOOrder> Redirect;
[PXButton]
public virtual IEnumerable redirect(PXAdapter adapter)
{
throw new PXRedirectByScreenIDException("SO302000", PXBaseRedirectException.WindowMode.Base, true);
return adapter.Get();
}
}
我用Add Controls
添加了JavaScript控件。对于新页面(不自定义现有页面),使用 Edit ASPX
添加 JavaScript 通常更容易。 JavaScript 函数调用图形扩展中的重定向操作事件处理程序。
function Redirect_Initialize() { px_alls["ds"].executeCallback("redirect"); }
最后一步是在页面加载时调用 JavaScript 方法。我使用 CommandPerformed
因为我从经验中知道它会被可靠地调用。您可以尝试 Initialize
或其他类型的 Load
事件作为 JavaScript 入口点,但我不太幸运。
我测试了这个完整的解决方案,它确实在加载时进行了重定向。当您的条件不会以重定向结束时,它可能会执行太多回调,您必须对其进行测试并在必要时选择另一个入口点。
如果找不到合适的入口点,我会使用全局 JavaScript 变量作为标志,以便它只调用图形操作事件处理程序一次。重复调用 JavaScript 函数的开销非常低,重复回调服务器 (IIS/ASP.Net) 带来巨大的损失。
在某些情况下打开第一个页面时,是否有任何方法可以从一个自定义页面重定向到另一个自定义页面?
我已尝试将 PXRedirectByScreenIDException
与 RowSelected
事件一起使用,但未处理异常且重定向无效。
protected void PrimaryView_RowSelected(PXCache sender,PXRowSelectedEventArgs e)
{
if(some_expression)
{
throw new PXRedirectByScreenIDException("II999999", PXBaseRedirectException.WindowMode.Base, true);
}
}
许多 Acumatica 功能只能在狭窄范围内工作。我注意到 Redirection Exception
在 Action Event Handler
的上下文中执行时总是有效。据推测,在执行这些处理程序时,框架将调用包装在一个 catch 块周围,该块专门捕获那些重定向异常类型并执行重定向。在其他情况下,它可能不会捕获此特定类型,并导致部分未处理的异常。
所以我在页面加载时重定向的想法是在操作事件处理程序中抛出重定向异常。该操作需要从 UI 上下文中调用,否则它仍将未处理。所以我将使用 JavaScript 在页面加载时从 UI 调用操作。
在操作事件处理程序的上下文中抛出重定向异常的图形扩展:
public class SOOrderEntry_Extension : PXGraphExtension<SOOrderEntry>
{
public PXAction<SOOrder> Redirect;
[PXButton]
public virtual IEnumerable redirect(PXAdapter adapter)
{
throw new PXRedirectByScreenIDException("SO302000", PXBaseRedirectException.WindowMode.Base, true);
return adapter.Get();
}
}
我用Add Controls
添加了JavaScript控件。对于新页面(不自定义现有页面),使用 Edit ASPX
添加 JavaScript 通常更容易。 JavaScript 函数调用图形扩展中的重定向操作事件处理程序。
function Redirect_Initialize() { px_alls["ds"].executeCallback("redirect"); }
最后一步是在页面加载时调用 JavaScript 方法。我使用 CommandPerformed
因为我从经验中知道它会被可靠地调用。您可以尝试 Initialize
或其他类型的 Load
事件作为 JavaScript 入口点,但我不太幸运。
我测试了这个完整的解决方案,它确实在加载时进行了重定向。当您的条件不会以重定向结束时,它可能会执行太多回调,您必须对其进行测试并在必要时选择另一个入口点。
如果找不到合适的入口点,我会使用全局 JavaScript 变量作为标志,以便它只调用图形操作事件处理程序一次。重复调用 JavaScript 函数的开销非常低,重复回调服务器 (IIS/ASP.Net) 带来巨大的损失。