在打开第一页的某些情况下,是否可以从一个自定义页面重定向到另一个自定义页面?
我尝试将PXRedirectByScreenIDException
与RowSelected
事件一起使用,但未处理该异常,并且重定向不起作用。
protected void PrimaryView_RowSelected(PXCache sender,PXRowSelectedEventArgs e)
{
if(some_expression)
{
throw new PXRedirectByScreenIDException("II999999", PXBaseRedirectException.WindowMode.Base, true);
}
}
答案 0 :(得分:1)
许多Acumatica功能仅在狭窄范围内起作用。我注意到Redirection Exception
在Action Event Handler
的上下文中执行时始终有效。大概在执行这些处理程序时,框架会将调用包装在一个catch块周围,该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)会带来巨大损失。