Aras 开发 Cookbook
这组文章把零散的 Aras 项目代码整理成可以判断、可以迁移、也可以拒绝的开发手册。重点不是“复制一段能跑的代码”,而是先确认代码运行在哪一层、依赖哪个版本、是否真正经过权限与事务边界。
适用版本: 以 Aras Innovator R31 配置模型为当前基线,同时保留 11.0 SP9 / 12 / 14+ 的明确兼容注记。
执行层: 本页是目录与治理规则;具体代码分为客户端、服务端、AML 与 DBA 层。
主要依据: R31《Configuring Solutions Student Guide》、2025 Aras DevOps Student Guide Unit 01-18、11.0 SP9《基本开发详解》,以及目标 Release 的官方 Platform Specifications / Programmer's Guide。
阅读前先确认
用户提供的代码素材记录了真实项目经验,但它们不等于跨版本公共 API。尤其是 Classic Form、关系页签、搜索窗口和网格代码,常常依赖特定 Release 的窗口层级、DOM 或内部对象。
内容导航
| 主题 | 解决的问题 |
|---|---|
| 表单、字段与关系页签 | 字段联动、只读、页签显隐、刷新,以及 Classic client 的兼容边界 |
| 搜索对话框与关系网格 | 固定搜索条件、打开对话框、更新关系行、复制当前查询 |
| 工作流、任务与签核人 | Controlled Item、动态签核人、条件流程、InBasket Task、系统事件 |
| 文件、下载与通知 | Vault、File 容器、上传下载、邮件、页面通知和剪贴板 |
| 权限、Method 与事务 | UI 限制和服务端授权的区别、受控提权、错误返回、xProperty 更新 |
| 诊断、版本与数据库 | .NET 版本核验、调试、递归查询、SQL 与 IIS 故障处理边界 |
四级标注
后续页面使用同一套标注。标注描述的是“能否作为文档主线”,不是对原作者的评价。
| 标注 | 含义 | 使用方式 |
|---|---|---|
Stable | 公开的数据模型、IOM/AML 模式或平台原则 | 可以作为主线,但仍需在目标 Release 验证 |
Classic client compatibility | Classic Form 或旧客户端的兼容写法 | 必须注明适用 Release、事件和窗口上下文 |
Private API | 未文档化的 DOM、frame、grid 或 CCO 内部接口 | 隔离在适配器中,并为每次升级做回归测试 |
Reject | 会绕过权限/事务、包含明显错误,或可能破坏数据 | 只解释风险,不提供可直接执行的破坏性原稿 |
判断顺序
先找配置能力,再找公开 IOM/AML,最后才考虑客户端兼容层。只要逻辑涉及授权、完整性或审计,就必须在服务端再次验证。
资料版本线索
- 《基本开发详解》封面为 Aras Innovator
11.0 SP9,PDF 生成于 2019 年,部分课件画面来自更早时期。AML、IOM、Item、Relationship 和事件模型仍有参考价值;Internet Explorer、COM、旧 Dialog、relTabbar、frame 和 grid applet 代码只作为历史兼容资料。 - 原厂《Configuring Solutions Student Guide》PDF 元数据标明 Innovator
R31,生成于 2024 年 12 月。它是 ItemType、Property、Responsive Form、Security、Workflow、Vault、CUI 与 Packaging 的主要配置依据,不是客户端 JavaScript API 参考。 - 原厂 Aras DevOps Unit 01-18 生成于 2025 年初,示例同时出现不同 baseline 与 Method Template 版本。它们适合说明 LDE/SDE、Git、Package、PR、测试和发布流程,但具体命令仍须服从项目仓库的 baseline。
- 平台运行时不能靠“Aras 年份 = 某个 .NET 版本”推算。应查目标 Release 的 Platform Specifications,并分别检查 Innovator Server、Client、OAuth Server 等组件。
安全基线
- UI 隐藏、禁用或只读只改善体验,不构成权限控制。
- 业务写入使用 IOM/AML,让权限、事件、版本、历史和事务继续生效。
- 不直接修改
innovator架构表,不在 Method 中手动回滚框架事务。 - 不把用户值拼进 AML、SQL、XPath 或 HTML;优先使用 IOM 属性方法和参数化接口。
- 权限提升必须最小化:限定 Identity、限定代码块、保证释放,并留下审计理由。
document.write、未转义 HTML、内部数据库列表页和真实环境地址不得进入公开文档。- 所有
Private API必须由版本适配器包住,页面代码不能到处访问parent[n]或内部 grid 对象。
Source mapping
下表说明 50 份原始素材被吸收到哪里,以及最终如何处置。表内不保留素材中的真实 GUID、内网地址或业务对象名。
| 原文件名 | 落位 | 处置 |
|---|---|---|
页签栏位Value实时写入.js | 表单、字段与关系页签 | Private API:保留“UI 与客户端 DOM 同步”概念,重写接口边界 |
页签右键新增.js | 搜索对话框与关系网格 | Private API:去除硬编码和立即落库造成的孤儿风险 |
隐藏页签.js | 表单、字段与关系页签 | Classic client compatibility:按 Release 提供兼容层 |
右键新增数据到页签.js | 搜索对话框与关系网格 | Private API:修正未定义行、固定 frame 和错误上下文 |
原生弹窗.js | 文件、下载与通知 | Classic client compatibility:整理为统一通知入口 |
增加删除签审人员.cs | 工作流、任务与签核人 | 重写为幂等、限定 Activity 的 IOM 操作;拒绝批量误删 |
自动下载.js | 文件、下载与通知 | Reject:移除非 Vault 静态文件示例 |
阻止数据回滚.cs | 权限、Method 与事务 | Reject:禁止手动破坏框架事务 |
组分复制到粘贴板.js | 文件、下载与通知 | 查询与复制拆开;改用 Clipboard API 并处理失败 |
Get My Controlled Item(从当前签审页面找到签审表单调用方式var formItem = this.apply(Get My Controlled Item);).txt | 工作流、任务与签核人 | Classic client compatibility:优先调用目标版本内置 Method,不复制旧实现 |
ShowDisplay(显示和隐藏字段).js | 表单、字段与关系页签 | Classic Form 示例;补加载检查并声明非权限控制 |
SQL更新刷新.cs | 权限、Method 与事务 | Reject:直接 SQL 更新改为 IOM edit |
SQL解锁.sql | 诊断、版本与数据库 | Reject 原稿;只保留 DBA 分阶段处置原则 |
表单字段页签只读.js | 表单、字段与关系页签 | Reject 原实现;移除 eval、无限轮询和吞错 |
表头字段Value实时写入.js | 表单、字段与关系页签 | Classic client compatibility:补事件上下文与版本说明 |
查看Aras对应.Net版本.md | 诊断、版本与数据库 | 推翻固定对应表,改为逐组件核验 |
打开创建的窗体.js | 搜索对话框与关系网格 | Classic client compatibility:查询 Form、错误与 Promise 分层处理 |
打开对象搜索页面代码.js | 搜索对话框与关系网格 | 两套版本 API 拆开,统一由 adapter 调用 |
代码发邮件.cs | 文件、下载与通知 | Reject 原稿;优先 Email Message 配置,代码仅做必要补充 |
代码模板-12版.js | 权限、Method 与事务 | 修正为 C# 历史模板;默认移除全局提权 |
代码模板-14版.cs | 权限、Method 与事务 | 保留作用域释放思想,不默认提升到高权限 Identity |
代码模板-前端.js | 表单、字段与关系页签 | 上下文显式传入,拒绝用 frame 索引猜当前 Item |
到VisualStudio调试代码.cs | 诊断、版本与数据库 | 仅 LDE;生产环境禁止启动 JIT 调试器 |
登录成功失败退出日志.cs | 工作流、任务与签核人 | 拆成三个 System Event handler,增加隐私与保留策略 |
递归查询.xml | 诊断、版本与数据库 | Stable 概念:拆分查询、限制深度和返回字段 |
递归重下往上查询.sql | 诊断、版本与数据库 | 仅只读 DBA/报表诊断;应用主线改用受权查询 |
调试浏览器不显示代码加这句.js | 诊断、版本与数据库 | 保留 sourceURL 技巧,名称唯一且不进入生产包 |
发起不同工作流程.cs | 工作流、任务与签核人 | Reject 原稿;修正重复判断并禁止直改 Workflow 表 |
非管理人员上传文件报错解法.sql | 文件、下载与通知 | Reject:禁止固定 ID 直插系统 File Container |
附加数据库执行语句.sql | 诊断、版本与数据库 | 仅恢复场景,由 DBA 按 SQL Server 版本重建映射 |
根据条件切换页签显示.js | 表单、字段与关系页签 | 整理为有超时的 Classic adapter |
获取Aras有几个数据库代码.txt | 诊断、版本与数据库 | Reject:不公开数据库枚举端点与环境地址 |
获取XML里的值.cs | 诊断、版本与数据库 | 重写为有节点、属性和索引检查的 XML 解析 |
获取我的任务.cs | 工作流、任务与签核人 | 去除权限提升,修正 24 小时时间格式与时区假设 |
解决SQL报警告.cs | 诊断、版本与数据库 | 参数化只读诊断;不把它包装成常规业务写入方式 |
解决TOC不显示icon问题.md | 诊断、版本与数据库 | Reject 原方案;禁止覆盖 web.config 和放大到极端请求上限 |
禁用页签.js | 表单、字段与关系页签 | 合并进页签 adapter;修正方法大小写与布尔参数 |
快速打开指定对象.txt | 搜索对话框与关系网格 | 环境地址、类型和 ID 参数化;注明登录与版本前提 |
拿取当前搜索条件.js | 搜索对话框与关系网格 | Reject 原稿;禁止私有查询对象直传和 document.write |
前端上传文件代码.js | 文件、下载与通知 | 选择、上传、关联、失败清理四步重写 |
权限获取.js | 权限、Method 与事务 | 只用于 UI 提示;服务端继续强制授权 |
刷新代码.js | 表单、字段与关系页签 | Private API:拒绝 parent[n],集中到版本 adapter |
搜索栏位设只读.js | 搜索对话框与关系网格 | 保留固定过滤对象模式,补齐上下文和空值校验 |
限制窗体栏位是否可用代码.js | 表单、字段与关系页签 | 保留 UI 禁用,明确不替代 Permission/Server Event |
限制搜索内容.js | 搜索对话框与关系网格 | Reject 拼接 where/idlist;改为服务端 IOM 查询 |
消息红色背景通知.js | 文件、下载与通知 | 统一通知和 Clipboard API,移除旧复制命令依赖 |
修改XProperty值.cs | 权限、Method 与事务 | IOM 读写示例;修正变量、XML 和错误处理 |
修改添加至变更单变更类型.txt | 工作流、任务与签核人 | 仅保留 OOTB Method 线索,禁止把内部 Method 当稳定 API |
页签编辑权限卡控.js | 表单、字段与关系页签 | UI 层规则;服务端重复校验实际权限和状态 |
页签表格上色.js | 搜索对话框与关系网格 | Private API:不发布内部 grid 结构直改代码 |
