ASPCMS订单页标签速查:商城模板字段调用全集

ASPCMS商城订单模板二开常被字段返回为空、版本差异、缓存清理这些细节卡住。保哥把2.5 SP3商城版订单完成页与订单填写页能调用的全部aspcms:order字段、循环遍历语法、实战定制案例(支付方式图标化、倒计时支付提醒、打印按钮)汇总在这张速查表里,附返回示例与版本兼容备注。

张文保 更新 28 分钟阅读 1,258 阅读

给 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)13800138000ASPCMS 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.7SmartyTemplate 风格 {$order.字段名}{foreach from=$goods_list item=goods}...{/foreach}清 cache 和 templates_c 两个目录
ShopEx 4.8XML 风格 <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 个已经在规划迁移。最现实的迁移路径不是一次性切,而是分阶段:

  1. 第一阶段:用 nginx 反代把订单管理后台逐步迁到独立的现代后端(Node.js / Go),前台展示页继续走 ASPCMS。
  2. 第二阶段:把订单数据同步层做出来,新订单写入新库,旧订单保留在 ASPCMS 的 access.mdb 或 SQL Server 里供查询。
  3. 第三阶段:商品库、会员库陆续迁移。这一阶段最容易出问题的是 URL 规则——ASPCMS 的商品详情页路径需要做 301 重定向,否则 SEO 流量会断崖。
  4. 第四阶段:彻底下线 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

继续阅读
发表评论
分享到微信 或在下方手动填写
支持 Ctrl + Enter 提交