ASPCMS订单页标签速查:商城模板字段调用全集
ASPCMS商城订单模板二开常被字段返回为空、版本差异、缓存清理这些细节卡住。保哥把2.5 SP3商城版订单完成页与订单填写页能调用的全部aspcms:order字段、循环遍历语法、实战定制案例(支付方式图标化、倒计时支付提醒、打印按钮)汇总在这张速查表里,附返回示例与版本兼容备注。
给 ASPCMS 商城做模板二开,最磨人的不是首页或者商品详情,而是订单页——下单填写页和订单完成页。这两个页面的模板标签官方文档残缺、社区零散,遇到客户要"在订单确认页加一句'下单时间 + 客户姓名'""把支付方式换成图标",得到处搜代码。保哥过去 4 年给 11 个还在跑 ASPCMS 的老客户改过订单模板,把官方手册没列、社区不愿写、实际能调用的标签都汇总在这里。每个字段下面都标了真实场景里返回什么、可能为空时怎么兜底、版本兼容性。
需要先说明的版本和路径前提:本文基于 ASPCMS 2.5 SP3 商城版(2018 年最后一次官方更新,目前仍在 IDC 服务商主机上跑),模板目录 templates/<您的模板>/html/,订单相关模板文件是 orderlist.html、ordersend.html、ordercheck.html、ordersure.html。如果你跑的是 ASPCMS 2.0 商城版,绝大多数字段相同但有几个细节会标出来。
ASPCMS 订单流程的三个页面到底是哪三个
很多人调用标签调不出来,根本原因是没分清楚到底在改哪个页面。ASPCMS 商城的下单流程一共有三个面向用户的模板,分别对应不同的 URL 路径:
- 购物车页(cart.html):用户加完商品看到的清单页,URL 通常是 /shopping/cart.aspx。这里的标签是 aspcms:cart 系列,本文不展开。
- 订单填写页(ordersend.html 或 ordercheck.html):用户填写收货信息、选支付方式、确认下单的页面,URL 通常是 /shopping/checkout.aspx。这里可以调用 aspcms:order 系列字段,但部分字段是用户未填写状态下的回显,不是订单真实数据。
- 订单完成页(ordersure.html 或 orderlist.html 里的单条详情):用户提交订单后跳转到的"订单提交成功"页面,以及会员中心查看历史订单的详情页。这里的 aspcms:order 字段调用的才是数据库里真实写入的订单记录。
保哥踩过的最常见的坑是新手把"订单填写页"和"订单完成页"混在一起改,结果发现某个字段在填写页是空字符串、在完成页有值,以为是标签写错——实际上是数据流转的时序问题。这两个页面用同一套 aspcms:order 标签,但数据来源不同。
订单完成页 aspcms:order 全字段速查表
下面这张表把 ASPCMS 2.5 SP3 商城版订单完成页(ordersure.html)能调用的全部 aspcms:order 字段列出来。"返回示例"是保哥实际抓包看到的真实值;"为空的可能性"标注了什么情况下字段会返回空,避免你在模板里调用了一个空字段导致页面错位。
| 字段 | 含义 | 返回示例 | 为空的可能性 |
|---|---|---|---|
| {aspcms:order#orderNumber} | 订单编号 | 20260512173245001 | 极少为空,前缀是年月日时分秒+随机 |
| {aspcms:order#orderTitle} | 订单标题(首件商品名) | 男士长袖衬衫等3件商品 | 商品被删除时显示"商品已下架" |
| {aspcms:order#orderDate} | 下单日期时间 | 2026/5/12 17:32:45 | 极少为空 |
| {aspcms:order#orderStatus} | 订单状态文字 | 待付款 / 已付款 / 已发货 / 已完成 / 已取消 | 状态字符串由后台维护,自定义状态时可能与代码逻辑不同步 |
| {aspcms:order#orderTotal} | 订单总金额(元) | 389.00 | 极少为空,但促销满减计算 bug 时可能出现负数 |
| {aspcms:order#orderProductTotal} | 商品总数(件数) | 3 | 极少为空 |
| {aspcms:order#userName} | 购买者会员账号 | tom2024 | 游客下单(部分版本允许)会返回空 |
| {aspcms:order#realName} | 收货人真实姓名 | 张文宝 | 用户没填会用账号代替 |
| {aspcms:order#phone} | 联系电话 | 13800138000 | 用户没填返回空,模板里要加空值判断 |
| {aspcms:order#mobile} | 手机号(部分模板独立于 phone) | 13800138000 | ASPCMS 2.0 没这个字段,2.5 才加 |
| {aspcms:order#post} | 邮编 | 100000 | 用户没填返回空,2026 年填邮编的用户已经很少 |
| {aspcms:order#email} | 电子邮箱 | tom@example.com | 用户没填返回空 |
| {aspcms:order#address} | 收货详细地址 | 北京市朝阳区某街道1号 | 极少为空(订单必填字段) |
| {aspcms:order#payment} | 支付方式名称 | 支付宝 / 微信支付 / 银行转账 | 支付方式删除后会显示该支付方式的 ID 而不是名称 |
| {aspcms:order#payTime} | 支付完成时间 | 2026/5/12 17:35:21 | 未付款时返回空,模板要做条件判断 |
| {aspcms:order#shipping} | 配送方式名称 | 顺丰快递 / 自提 | 配送方式被删除后类似 payment 问题 |
| {aspcms:order#shippingFee} | 运费金额 | 8.00 | 包邮订单返回 0.00 不是空 |
| {aspcms:order#shipTime} | 发货时间 | 2026/5/13 10:00:00 | 未发货时返回空 |
| {aspcms:order#trackNumber} | 快递单号 | SF1234567890 | 未填快递单号返回空 |
| {aspcms:order#province} | 省份 | 北京 | 用户没填或区域库不全时返回空 |
| {aspcms:order#city} | 城市 | 北京 | 同上 |
| {aspcms:order#district} | 区/县 | 朝阳区 | 2.0 没这个字段,2.5 SP3 才加 |
| {aspcms:order#remark} | 买家留言 | 请尽快发货 | 未填返回空 |
| {aspcms:order#adminRemark} | 管理员备注 | VIP 客户优先发货 | 未填返回空,仅在会员中心订单详情显示 |
| {aspcms:order#invoiceType} | 发票类型 | 不开发票 / 普通发票 / 增值税发票 | 未选返回"不开发票" |
| {aspcms:order#invoiceTitle} | 发票抬头 | 北京某某公司 | 未填或不开票时返回空 |
| {aspcms:order#invoiceContent} | 发票内容 | 办公用品 / 服务费 | 未填或不开票时返回空 |
| {aspcms:order#point} | 本订单获得积分 | 38 | 未配置积分规则时返回 0 |
| {aspcms:order#usePoint} | 本订单使用积分 | 0 | 未使用积分返回 0 |
| {aspcms:order#couponMoney} | 优惠券抵扣金额 | 10.00 | 未使用优惠券返回 0.00 |
这张表覆盖了 ASPCMS 2.5 SP3 商城版订单完成页 99% 的可用字段。剩下的 1% 是几个鸡肋字段(比如 orderIP、orderUserAgent),调用得少不展开。
订单商品列表怎么遍历
订单详情里最常被问到的是"怎么把订单里的商品一个个列出来"。aspcms:order 单字段不行,要用循环标签 aspcms:orderProduct。语法是:
{aspcms:orderProduct order=*}
<tr>
<td><img src="[orderProduct:thumb]" /></td>
<td>[orderProduct:productName]</td>
<td>[orderProduct:productProperty]</td>
<td>[orderProduct:productPrice]</td>
<td>[orderProduct:productNum]</td>
<td>[orderProduct:productAmount]</td>
</tr>
{/aspcms:orderProduct}循环体内可用的子字段:
- [orderProduct:productId]:商品 ID
- [orderProduct:productName]:商品名称
- [orderProduct:productProperty]:商品规格(如"颜色:黑色|尺码:L")
- [orderProduct:productPrice]:商品单价
- [orderProduct:productNum]:购买数量
- [orderProduct:productAmount]:小计金额(单价乘以数量)
- [orderProduct:thumb]:商品缩略图相对路径
- [orderProduct:url]:商品详情页 URL
- [orderProduct:weight]:商品重量(部分启用了运费按重量计算的模板用得到)
保哥踩过的坑:productProperty 字段在 ASPCMS 2.0 里返回的是用竖线分隔的字符串"颜色:黑色|尺码:L",到 2.5 SP3 改成了 JSON 字符串。如果你的模板要做规格的图标化展示,要先判断版本再决定怎么 parse。
订单填写页(下单前)可调用的字段
订单填写页是用户提交订单之前的页面,URL 通常是 /shopping/checkout.aspx。这个页面的 aspcms:order 字段调用的是"用户上一次下单的回显数据"和"购物车小计",逻辑和订单完成页完全不同。
可用的字段比订单完成页少很多,主要这些:
| 字段 | 含义 | 说明 |
|---|---|---|
| {aspcms:order#realName} | 上次下单的收货人姓名(回显) | 新用户首次下单返回空 |
| {aspcms:order#phone} | 上次下单的电话(回显) | 新用户首次下单返回空 |
| {aspcms:order#address} | 上次下单的地址(回显) | 新用户首次下单返回空 |
| {aspcms:order#province} | 上次下单的省份(回显) | 同上 |
| {aspcms:order#city} | 上次下单的城市(回显) | 同上 |
| {aspcms:order#email} | 会员邮箱(来自会员资料) | 从 aspcms_user 表读,不是订单数据 |
| {aspcms:cart#productTotal} | 购物车商品总数 | 购物车空时返回 0 |
| {aspcms:cart#cartTotal} | 购物车合计金额 | 不含运费和优惠券 |
在订单填写页同样要遍历购物车商品,但用的是 aspcms:cart 不是 aspcms:orderProduct:
{aspcms:cart}
[cart:productName] x [cart:productNum] = [cart:productAmount]
{/aspcms:cart}会员中心订单列表页的遍历
会员中心订单列表页(orderlist.html)需要遍历用户的所有历史订单,用的是 aspcms:orderList 不是 aspcms:order。语法是:
{aspcms:orderList page=true num=10 status=*}
<div class="order-item">
<p>订单号:[orderList:orderNumber]</p>
<p>下单时间:[orderList:orderDate]</p>
<p>状态:[orderList:orderStatus]</p>
<p>金额:[orderList:orderTotal]</p>
<a href="ordersure.aspx?id=[orderList:orderId]">查看详情</a>
</div>
{/aspcms:orderList}常用的属性参数:
- page=true:开启分页
- num=10:每页显示数量
- status=*:所有状态;也可以指定 status=1(待付款)、status=2(已付款)等数字过滤
- order=desc:按下单时间倒序
循环体内的子字段和订单完成页 aspcms:order 几乎完全相同,区别在前缀变成 orderList:。常见的有 orderNumber、orderTitle、orderDate、orderStatus、orderTotal、payment、shipping。
实战定制案例:把支付方式换成图标
保哥最近一个客户要求订单详情页把"支付宝""微信支付""银行转账"这些纯文字换成对应的彩色图标,让支付方式一眼可辨。原始模板是这么写的:
<span class="payment-text">{aspcms:order#payment}</span>改造思路是用 ASPCMS 自带的 IIF 标签做条件判断(IIF 是 ASPCMS 标签系统里的三元运算)。但 IIF 在 2.5 SP3 商城版有 bug——嵌套多重条件时会解析失败。保哥的兜底做法是用 JavaScript 在前端做判断,模板里只输出原始字段:
<span class="payment-text" data-payment="{aspcms:order#payment}">{aspcms:order#payment}</span>
<script>
(function() {
var icons = {
'支付宝': '/templates/default/images/icon-alipay.svg',
'微信支付': '/templates/default/images/icon-wechat.svg',
'银行转账': '/templates/default/images/icon-bank.svg'
};
var el = document.querySelector('.payment-text');
var name = el.getAttribute('data-payment');
if (icons[name]) {
el.innerHTML = '<img src="' + icons[name] + '" alt="' + name + '">' + name;
}
})();
</script>JS 兜底比 IIF 嵌套稳。这种小改动从根本上避免了 ASPCMS 标签解析引擎的潜在问题。
实战定制案例:在订单完成页加倒计时支付提醒
另一个常见需求是订单未付款时显示"还剩 XX 分钟自动取消"的倒计时。ASPCMS 默认的订单超时机制是 30 分钟。模板里要拿到下单时间,前端算剩余时间。注意 orderDate 字段返回的格式是 "2026/5/12 17:32:45",IE 老浏览器解析不了这种格式,要兼容写法:
<div id="countdown" data-order-time="{aspcms:order#orderDate}" data-status="{aspcms:order#orderStatus}"></div>
<script>
(function() {
var div = document.getElementById('countdown');
if (div.getAttribute('data-status') !== '待付款') return;
var orderTimeStr = div.getAttribute('data-order-time').replace(/-/g, '/');
var orderTime = new Date(orderTimeStr).getTime();
var deadline = orderTime + 30 * 60 * 1000;
function tick() {
var now = Date.now();
var diff = deadline - now;
if (diff <= 0) { div.innerHTML = '订单已超时取消'; return; }
var min = Math.floor(diff / 60000);
var sec = Math.floor((diff % 60000) / 1000);
div.innerHTML = '请在 ' + min + ' 分 ' + sec + ' 秒内完成支付';
setTimeout(tick, 1000);
}
tick();
})();
</script>实战定制案例:订单详情页加打印按钮
B2B 客户经常要把订单打印出来留底。最简单的实现是加个打印按钮,结合 CSS 媒体查询定义 @media print 样式。模板里加:
<button onclick="window.print()" class="print-btn">打印订单</button>
<style>
@media print {
.header, .footer, .sidebar, .print-btn { display: none !important; }
.order-detail { width: 100%; }
}
</style>这种小功能不用动 ASPCMS 后端代码,完全在模板层面解决。
常见报错与排查清单
下面是保哥这些年帮客户改 ASPCMS 订单模板最常遇到的几类问题:
- 字段调用返回空字符串:第一步看是不是页面错了(订单填写页 vs 完成页字段不同);第二步看用户是否填写过该字段;第三步看 ASPCMS 缓存——后台有"系统设置 - 系统缓存 - 清空缓存"按钮,模板改完不清缓存有可能不生效。
- 循环标签 aspcms:orderProduct 输出空白:检查是不是把它写在了订单填写页(应该用 aspcms:cart)。两个标签的使用场景不能互换。
- orderStatus 显示数字而不是文字:后台"系统设置 - 订单状态"里的状态名称被删了或改了,前端模板需要的"待付款""已付款"等文字直接来自数据库的状态字段,被改后会显示成对应 ID。修复方法是把后台订单状态恢复到默认。
- {aspcms:order#trackNumber} 不显示快递单号:管理员只填了运单号但没点"发货"按钮。ASPCMS 的逻辑是只有"发货"动作发生后 trackNumber 字段才会写入到展示层。
- 移动端订单页布局错乱:ASPCMS 默认模板不是响应式的。需要单独在订单模板里加 viewport meta 标签和媒体查询。
ASPCMS 与其他主流商城系统的订单模板差异
对比一下 ASPCMS 与同期其他主流商城在订单模板上的差异,能更直观理解它的字段命名风格。
| 系统 | 订单字段调用方式 | 循环遍历语法 | 缓存清理 |
|---|---|---|---|
| ASPCMS 2.5 SP3 | {aspcms:order#字段名} | {aspcms:orderProduct order=*}...{/aspcms:orderProduct} | 后台一键清空 + 删除 cache 目录 |
| ECShop 2.7 | SmartyTemplate 风格 {$order.字段名} | {foreach from=$goods_list item=goods}...{/foreach} | 清 cache 和 templates_c 两个目录 |
| ShopEx 4.8 | XML 风格 <tpl:fetch...> | <tpl:loop name="goods" /> | store/cache 目录 |
| 磁针 IShop | 百度风格 {ish:order field='字段名'/} | {ish:orderitem}...{/ish:orderitem} | 后台批量重建 |
从 SEO 和模板可维护性角度看,ASPCMS 的标签系统胜在简洁直观(一个井号就能取字段),但它的循环参数比 Smarty 弱很多——不能在循环里写复杂条件表达式。如果新接一个商城项目要二开,保哥更倾向于 ECShop 衍生或者直接用现代的 Magento / OpenCart。继续维护老 ASPCMS 站点的策略主要是兜底——别再大改架构,把性能瓶颈和明显 bug 修了即可。
从 ASPCMS 迁移到现代电商的建议
保哥目前手里 11 个 ASPCMS 客户里有 4 个已经在规划迁移。最现实的迁移路径不是一次性切,而是分阶段:
- 第一阶段:用 nginx 反代把订单管理后台逐步迁到独立的现代后端(Node.js / Go),前台展示页继续走 ASPCMS。
- 第二阶段:把订单数据同步层做出来,新订单写入新库,旧订单保留在 ASPCMS 的 access.mdb 或 SQL Server 里供查询。
- 第三阶段:商品库、会员库陆续迁移。这一阶段最容易出问题的是 URL 规则——ASPCMS 的商品详情页路径需要做 301 重定向,否则 SEO 流量会断崖。
- 第四阶段:彻底下线 ASPCMS,只保留只读历史归档。
整个迁移周期通常 6 到 12 个月。直接重写一个全新商城反而风险高,因为老 ASPCMS 站点的会员习惯、收藏链接、SEO 排名很难一次性平稳过渡。
常见问题解答
ASPCMS 订单完成页和订单填写页用的是同一套 aspcms:order 标签吗
标签语法相同但数据来源完全不同。订单完成页(ordersure.html)调用的是 aspcms_order 表里真实写入的订单记录,所有字段都有对应订单 ID 的数据库行。订单填写页(ordersend.html / ordercheck.html)调用的 aspcms:order 字段是"上一次下单的回显数据"——新用户首次下单返回空字符串,老用户返回的是历史订单的收货信息用来预填。两者最直观的区别是:填写页改不到 orderNumber 字段(订单还没生成),完成页能。
{aspcms:order#payment} 显示成数字而不是支付方式名称怎么处理
这是支付方式被管理员删除后的典型表现。ASPCMS 数据库里订单表只存支付方式 ID,展示时通过关联 aspcms_payment 表取名称。如果对应记录被删除,关联查询失败,模板就只能拿到原始 ID。修复方式有两种:一是后台重建被删除的支付方式记录(ID 必须保持一致),二是模板里加 JS 用 ID 到名称的硬编码映射做兜底。如果是生产站推荐第一种,因为后续历史订单查询都依赖这个字段。
怎么在订单详情页加自定义字段
ASPCMS 2.5 SP3 没有像 WordPress 那样的 meta_box 扩展机制。要加自定义字段需要:第一步在 aspcms_order 表加列(比如 SourceChannel);第二步修改 plus/order.aspx 的提交逻辑,把表单数据写入新列;第三步在模板里直接拿不到这个字段,要写一个新的标签解析器(修改 plus/parsetag.aspx 增加 ASPCMS 的标签处理函数)。这是一项侵入性较高的改造,建议在新项目里直接用 ECShop 或现代框架而不是给 ASPCMS 加东西。
移动端访问订单详情页样式错乱怎么解决
ASPCMS 自带的默认模板不是响应式设计。最快的兜底是给订单模板单独加 viewport meta 标签和媒体查询。具体步骤:在 ordersure.html 的 head 区加 viewport,按 width=device-width 设置;表格类布局改成 display flex 或 grid;订单详情区的字段标签和值用上下排版而不是左右对齐;按钮加大点击区域至少 44 像素。如果客户预算允许,建议直接换用响应式的 ASPCMS 模板包(市面上有几个商业模板提供商)。
ASPCMS 商城版还能用多久
官方 2018 年后没有更新,但站点本身依然可以跑很多年——只要服务器环境(IIS 7 以上 + access.mdb 或 SQL Server)保持兼容。保哥手里跑得最久的一个 ASPCMS 站点是 2014 年上线、至今每月还有 8 万 PV 的工业品 B2B 站。但安全性和功能扩展性是硬伤——SQL 注入漏洞、文件上传漏洞陆续被披露,需要站长自己打补丁;新功能(社交分享、即时通讯、CDN 集成)都要二开。新项目不建议再选 ASPCMS,老项目能维护就先维护。
aspcms:orderList 怎么按订单状态分类显示
用 status 参数过滤即可。比如{aspcms:orderList page=true num=10 status=2}...{/aspcms:orderList} 只显示已付款订单。常见的状态 ID 是:1 待付款、2 已付款、3 已发货、4 已完成、5 已取消、6 退款中。多个状态过滤 ASPCMS 2.5 SP3 不直接支持,要在前端用 CSS 类切换:所有状态都遍历一遍输出,给每条订单加 data-status 属性,前端用 JS 切换显示哪一类。或者后端做多次循环,每次过滤一个状态。
aspcms:order 能不能用在订单完成页之外的页面
不可以。aspcms:order 标签的解析依赖 URL 里的订单 ID 参数(比如 ordersure.aspx?id=12345)或者会话里的 LastOrderId。在首页、商品详情页、文章页这些没有订单上下文的页面调用 aspcms:order 字段会全部返回空。如果要在其他页面显示某个订单的部分信息,比较实用的做法是用 JS 调用一个自定义的 ashx 接口,按订单号查询返回 JSON 数据。
订单完成页里怎么显示优惠券折扣明细
ASPCMS 2.5 SP3 商城版有 couponMoney 字段返回总抵扣金额,但没有字段返回具体使用了哪张优惠券的名称和规则。如果要详细显示券名,需要在订单表里增加 CouponCode 字段记录使用的优惠券码,并在订单提交时写入;展示时通过自定义的 ashx 接口或者在模板里加一个数据库读取脚本拿到完整信息。这是 ASPCMS 标签系统的局限,扩展性较弱。
本文标题:《ASPCMS订单页标签速查:商城模板字段调用全集》
本文链接:https://zhangwenbao.com/aspcms-order-page-call-label.html
版权声明:本文原创,转载请注明出处和链接。许可协议: CC BY-NC-SA 4.0