如何通过拦截Acumatica的PXRedirectException实现SO/PO统一重定向至自定义页面
统一拦截Acumatica SO/PO页面重定向的可行方案
方案1:全局拦截PXRedirectException实现重定向替换
Acumatica中绝大多数页面重定向是通过抛出PXRedirectException完成的,你可以在全局请求处理环节拦截该异常,检查目标页面是否为原生SO/PO页面,直接替换为自定义页面即可,无需逐个修改原有重定向代码。
实现步骤:
- 在
Global.asax.cs中注册全局请求预处理事件,拦截并修改重定向异常:
protected void Application_Start(object sender, EventArgs e) { PXApplication.PreHandleRequest += PXApplication_PreHandleRequest; } private void PXApplication_PreHandleRequest(object sender, EventArgs e) { var context = HttpContext.Current; if (context == null) return; var redirectException = context.Items["PXRedirectException"] as PXRedirectException; if (redirectException == null) return; // 替换原生SO订单页面为自定义页面 if (redirectException.TargetPage == typeof(SOOrderEntry)) { context.Items["PXRedirectException"] = new PXRedirectException(typeof(CustomSOOrderEntry), redirectException.Parameters); } // 替换原生PO订单页面为自定义页面 else if (redirectException.TargetPage == typeof(POOrderEntry)) { context.Items["PXRedirectException"] = new PXRedirectException(typeof(CustomPOOrderEntry), redirectException.Parameters); } }
该方案能覆盖系统内所有通过PXRedirectException触发的重定向场景,包括列表页跳转、关联记录跳转、操作按钮跳转等。
方案2:重写BasePage的Redirect方法(覆盖范围更广但工作量略大)
如果存在部分重定向是直接调用页面Redirect方法而非抛出异常的场景,可以自定义基类页面并替换重定向逻辑:
- 创建自定义基类页面,重写
Redirect方法:
public class CustomBasePage : PX.Web.UI.PXBasePage { public override void Redirect(Type pageType, object[] parameters) { if (pageType == typeof(SOOrderEntry)) { base.Redirect(typeof(CustomSOOrderEntry), parameters); } else if (pageType == typeof(POOrderEntry)) { base.Redirect(typeof(CustomPOOrderEntry), parameters); } else { base.Redirect(pageType, parameters); } } }
- 将现有页面的继承关系从
PX.Web.UI.PXBasePage改为自定义基类(需修改所有相关页面的Inherits属性)。
注意事项
- 测试时需覆盖所有重定向场景,确保原生SO/PO页面的跳转全部被替换。
- 自定义页面需兼容原页面的重定向参数(如订单ID等),保证业务逻辑正常流转。
内容的提问来源于stack exchange,提问作者user2803805
相关产品推荐
相关产品推荐

