TokenPay 发布时会把仓库中的默认 Razor 页面编译进程序集,因此发布目录中没有 Views 文件夹也可以正常显示支付页、错误页和后台页面。
程序启动时检测到内容根目录中存在 Views 文件夹,才会启用 Razor 运行时编译。如果需要修改页面,请先放置 Views 文件夹再启动 TokenPay;同路径的物理 .cshtml 会覆盖程序内置的默认页面,未放置的页面继续使用内置版本。
| 运行目录中的文件 | 实际使用的页面 |
|---|---|
不存在对应 .cshtml |
发布时编译进程序集的默认页面 |
存在对应 .cshtml |
运行目录中的物理页面,由运行时编译器编译 |
该机制只覆盖 Razor 页面,不会修改数据库或控制器业务逻辑。
最稳妥的方式是将源码中的整个目录复制到程序目录:
src/TokenPay/Views
部署后的结构示例:
TokenPay/
├── TokenPay.exe 或 TokenPay.dll
├── appsettings.json
├── EVMChains.json
├── wwwroot/
└── Views/
├── _ViewImports.cshtml
├── _ViewStart.cshtml
├── Home/
├── Admin/
└── Shared/
只覆盖个别页面时,也必须保持原有相对路径,并建议同时保留其依赖的 _ViewImports.cshtml、_ViewStart.cshtml 和布局文件。例如覆盖中文支付页:
Views/Home/Pay.cshtml
英文支付页是独立文件:
Views/Home/Pay.en.cshtml
修改一个语言页面不会自动修改其他语言页面。
页面通过文件名后缀区分语言:
| 文件名 | 语言 | 何时使用 |
|---|---|---|
Pay.cshtml(无后缀) |
中文 | 中文访客(zh、zh-CN、zh-TW 等) |
Pay.en.cshtml |
英文 | 英文访客、语言未注册的访客,以及缺少对应语言页面的访客 |
Pay.ru.cshtml 等 |
其他语言 | 仅当该语言已加入 ExtraLanguages 配置 |
查找顺序以俄语访客为例:Pay.ru.cshtml → Pay.en.cshtml → Pay.cshtml。即缺少对应语言的页面时显示英文页面;只有英文页面也不存在时,才使用不带后缀的页面。
程序默认只注册中文和英文,其他语言的访客一律显示英文页面。增加其他语言(以俄语 ru 为例)的步骤:
-
以源码中的中文页面(不带后缀的
.cshtml)为模板,复制到运行目录的Views下相同位置,文件名加上.ru后缀,然后把页面中的中文翻译为俄语:页面 模板(中文页面) 新建文件 默认支付页 Views/Home/Pay.cshtmlViews/Home/Pay.ru.cshtml主题支付页(以 v1-cyber-dark为例)Views/Home/v1-cyber-dark/Pay.cshtmlViews/Home/v1-cyber-dark/Pay.ru.cshtml订单过期页(所有主题共用) Views/Home/OrderExpired.cshtmlViews/Home/OrderExpired.ru.cshtml翻译时除了页面正文,还要注意以下容易遗漏的位置:
- 页面标题
ViewData["Title"] = "支付页"; - 页面语言标记
<html lang="...">,改为对应语言,如<html lang="ru">。主题页面写在页面顶部;默认支付页和订单过期页写在布局页中,见下文 页面写法 <script>中显示给访客的文字,例如倒计时单位(天、时、分、秒)、复制成功提示和alert弹窗。默认支付页的复制成功弹窗不在页面中,而是写在所有语言共用的wwwroot/js/site.js里,见下文
- 页面标题
-
在
appsettings.json中添加该语言,详见 配置说明:"ExtraLanguages": [ "ru" ]
-
重启 TokenPay,启动日志中的“支付页语言”一行应包含
ru。 -
在支付页链接末尾追加
&culture=ru(或将浏览器语言设为俄语)访问,确认显示的是俄语页面。
新增的语言页面可以沿用布局页,也可以自己编写完整的 HTML。两种写法的要求不同:
| 引用布局页 | 重写整个页面 | |
|---|---|---|
| 现有页面示例 | 默认支付页 Pay.cshtml、订单过期页 OrderExpired.cshtml |
各主题支付页,如 v1-cyber-dark/Pay.cshtml |
Layout 设置 |
不设置,由 _ViewStart.cshtml 自动使用 _Layout |
页面开头必须写 Layout = null; |
<html>、<head> 和 CSS/JS 引用 |
由 Views/Shared/_Layout.cshtml 提供 |
页面自己编写 |
| 页面脚本 | 写在 @section Scripts { } 中,由布局页输出 |
直接写在页面的 <script> 中,不能使用 @section |
布局页 Views/Shared/_Layout.cshtml 由所有语言共用,其中的 <html lang="en"> 和标题后缀“TokenPay支付中心”不随语言变化。如需修改,不要直接改 _Layout.cshtml,否则中文、英文页面也会一起改变。应复制一份带语言后缀的布局页:
Views/Shared/_Layout.ru.cshtml
布局页和普通页面一样按访客语言查找:_Layout.ru.cshtml → _Layout.en.cshtml → _Layout.cshtml。没有提供 _Layout.ru.cshtml 时,俄语页面继续使用共用的 _Layout.cshtml。
按语言查找只对按名称引用的布局生效,即 Layout = "_Layout"(_ViewStart.cshtml 的默认写法)。如果在页面中写成路径形式,如 Layout = "~/Views/Shared/_Layout.cshtml",则固定使用该文件,不会查找 _Layout.ru.cshtml。
布局页引入的 wwwroot/js/site.js 负责初始化“复制”按钮,复制成功的弹窗文字“复制成功!复制内容:”也写在其中,所有语言共用。如需翻译,可以复制一份(例如 wwwroot/js/site.ru.js)并在 _Layout.ru.cshtml 中改为引用它。
- 页面开头必须设置
Layout = null;。否则_ViewStart.cshtml仍会套用_Layout,页面会出现两层<html>。 - 需要自己编写
<html lang="ru">、<head>,并引入页面用到的 CSS 和 JS。以默认支付页Pay.cshtml为模板时,页面还依赖布局页引入的以下内容,需要在自己的页面中引入,引用路径可参照_Layout.cshtml:- Bootstrap 样式:页面布局所用的 class,如
text-center、btn - jQuery:页面脚本中的
$ - clipboard.js 和
wwwroot/js/site.js:“复制”按钮的功能由site.js初始化。不引入时,按钮点击后没有任何反应
- Bootstrap 样式:页面布局所用的 class,如
- 不能使用
@section Scripts { }。没有布局页时,@section中的内容不会输出,也不会报错。倒计时和支付状态轮询(支付完成后自动跳转)会因此静默失效。请把默认支付页@section Scripts { }中的脚本移到页面底部的<script>中,放在 jQuery 等依赖之后。
- 可以只翻译部分页面,例如只提供
Pay.ru.cshtml,此时俄语访客的订单过期页仍显示英文。 - 启用主题时,程序先在主题目录中查找页面,主题目录中的
Pay.en.cshtml优先于Views/Home/Pay.ru.cshtml。因此每个启用的主题都需要在自己的目录中提供Pay.ru.cshtml,否则俄语访客看到的是该主题的英文页面。 - 自定义主题目录如果只有不带后缀的
Pay.cshtml、没有Pay.en.cshtml,所有语言的访客都会使用这个页面。 - 文件名大小写需与默认页面保持一致(
Pay.ru.cshtml,而不是pay.ru.cshtml)。Linux 文件系统区分大小写,大小写不一致可能导致页面找不到。 - 支付页的倒计时和过期时间由
ExpireTimestamp(UTC 毫秒时间戳)计算,并在浏览器中按访客本地时区显示。自定义页面时请保留这部分脚本,不要改回用ToString("yyyy/MM/dd ...")输出的日期字符串:服务器会按访客语言格式化日期,泰语会输出佛历年份,印尼语、阿拉伯语的输出浏览器无法解析,倒计时都会显示异常。
运行时编译会监视物理 Razor 文件,通常保存后下一次请求即可看到变化。如果部署平台的文件监视不可用、使用了原子替换文件的发布方式,或页面仍被旧进程缓存,请重启 TokenPay。
删除外部覆盖文件后,程序会重新使用内置默认页面;必要时重启服务清除已经编译的运行时页面缓存。
默认页面会随程序集进入单文件发布产物,不需要单独复制 Views。外部覆盖目录仍应放在程序的内容根目录。建议从程序所在目录启动 TokenPay,确保 appsettings.json、EVMChains.json、wwwroot 和 Views 使用同一个内容根目录。
- 发布包必须保留运行时编译所需的依赖文件,不要在不了解影响时手工删除
.deps.json或相关程序集。 - 页面文件能够执行 Razor/C# 代码,只允许可信管理员写入
Views,不要提供网页上传.cshtml的功能。 - 更新 TokenPay 前备份自定义
Views。新版模型字段或布局可能变化,更新后需要对照新版默认页面合并修改。 - 页面样式和 JavaScript 位于
wwwroot。只修改.cshtml不会自动覆盖对应的 CSS 或 JS;如需定制静态资源,应保持原路径并做好备份。 - 修改页面后至少测试中文、英文支付页(以及通过
ExtraLanguages增加的语言)、订单过期页,以及启用后的后台页面。