尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Delphi 12 HTMX + WebStencils 中文实战:零JS动态网页开发指南
简介本资源是面向Delphi开发者的技术进阶指南聚焦Delphi 12在RAD Studio平台中集成HTMX与WebStencils实现高效Web开发的全新实践路径特别适合熟悉传统VCL/LFM但希望快速切入轻量级动态网页开发的中高级程序员。内容系统解析HTMX核心机制——包括hx-get/hx-post属性驱动的无JS异步请求、hx-swap控制的HTML片段精准替换、服务端主导的交互逻辑设计以及WebStencils作为可拖放HTML模板组件在RAD Studio中的集成应用。资源为单文件PDF文档919KB结构清晰含前言、HTMX原理详解、WebBroker架构对照、核心API说明及实操示例目录便于按需查阅与工程落地。目前已有479人学习下载读者可直接掌握免写JavaScript的声明式Web交互开发范式、服务器端驱动的页面更新策略以及基于RAD Studio生态的快速原型搭建方法。1. Delphi 12 的 HTMX WebStencils 中文手册不是“又一个前端框架”而是 RAD Studio 里真正能甩开 JavaScript 写动态网页的生产力杠杆你有没有试过在 Delphi 里写一个带实时刷新列表、表单提交不跳转、点击按钮局部更新内容的 Web 应用以前的答案往往是搭 ISAPI/WinCGI、手撸 HTML 拼接、硬塞TWebBroker响应流再配一堆 jQuery 或原生 JS 做 DOM 操作——结果是服务器端用 Object Pascal 写得飞起客户端却要切到 JS 世界里 debug 事件绑定、状态同步、防重复提交最后发现 bug 出在hx-target指错了 div ID而这个 ID 是 Delphi 生成的idtodo_list_123JS 却在等#todo-list……这种跨语言心智撕裂就是传统 WebBroker 开发最真实的血泪现场。这份《Delphi 12 控件之 htmx webstencils中文版.pdf》不是讲概念的幻灯片它是一份可直接抄作业的实战手册教你用纯 Delphi 原生 HTML 属性把hx-get/api/tasks这种声明式指令嵌进.dfm设计器拖出来的TWebModule响应中让浏览器自动发起请求、接收 HTML 片段、精准替换 DOM 节点——全程不用写一行fetch()或addEventListener。它面向的是已经会用TDataSetProvider和TClientDataSet做三层架构、但被 Web 交互卡在“会部署不会动效”阶段的 Delphi 老兵也适合刚从 VCL 转来、对TWebBrowser插件开发心有余悸的新手。这不是替代 Vue/React 的方案而是让 RAD Studio 真正成为“全栈 RAD 工具”的最后一块拼图。2. HTMX 在 Delphi WebBroker 中的运行机制为什么它能绕过 JavaScript又如何与 TWebModule 深度咬合HTMX 的本质是把“何时请求、向哪发、怎么更新”这些逻辑从 JavaScript 运行时提前固化到 HTML 元素的属性里。它不发明新语法只复用你早已熟悉的a、form、button结构靠hx-get、hx-post、hx-target这类自定义属性驱动行为。关键在于它不依赖客户端 JS 引擎执行逻辑而是靠浏览器原生事件click、submit、change触发再由 HTMX 的轻量 JS 库拦截并接管后续流程。这就决定了它和 Delphi WebBroker 的天然契合点——WebBroker 本就是以“接收 HTTP 请求 → 执行 Pascal 处理器 → 输出 HTML 响应”为原子单元的服务器端框架。HTMX 的请求对 WebBroker 来说就是一次标准的 GET/POST和用户手动刷新页面无异HTMX 要的响应就是一段干净的 HTML 片段比如li classtask买牛奶/li而非 JSON 或完整 HTML 页面。这种“请求-片段响应”的契约让 Delphi 开发者可以彻底放弃TWebBroker里那些为兼容旧浏览器写的Response.Content : html...;全页拼接转而专注写Response.Content : GetTaskItemHTML(AID);这样的高内聚函数。2.1 HTMX 核心属性与 Delphi WebModule 的映射关系HTMX 的每个核心属性都在 Delphi 的TWebModule处理器中对应着明确的代码落点。理解这个映射是避免“写了 hx 属性但页面不动”的前提hx-get/tasks浏览器点击时发起 GET 请求。Delphi 端需在TWebModule中注册TWebActionItem其PathInfo设为/tasksOnAction事件处理器中调用Response.ContentType : text/html; Response.Content : GenerateTaskListHTML();。hx-post/tasks表单提交时发起 POST。对应PathInfo为/tasks的另一个TWebActionItem但MethodType必须设为mtPost并在OnAction中解析Request.ContentFields获取表单数据。hx-target#task-list指定响应 HTML 插入的目标 DOM 元素 ID。Delphi 端无需做任何特殊处理——你只需确保GenerateTaskListHTML()返回的 HTML 片段结构正确如ul idtask-list.../ulHTMX JS 会自动找到该 ID 并替换其内部 HTML。hx-swapinnerHTML控制替换方式。默认值即innerHTML也可设为outerHTML替换整个元素、beforeend追加到末尾等。Delphi 端仍只管输出 HTML 字符串swap 行为完全由客户端 HTMX 库执行。提示hx-swap的取值必须与 Delphi 返回的 HTML 片段结构匹配。例如若hx-target指向div idcontainer/div而hx-swapinnerHTML则 Delphi 必须返回p内容/pul.../ul这类可直接插入div内部的 HTML若返回div idcontainerp.../p/div即包含外层容器则应设hx-swapouterHTML否则会导致嵌套错误。2.2 WebStencils不是 UI 组件库而是 Delphi 设计器里的“HTML 模板占位符”WebStencils 在这份手册里常被误解为“Delphi 的新控件”。它其实更接近一种设计约定一套预定义的、带特定id和class的 HTML 结构模板专为与 HTMX 配合而生。例如一个名为task-item.stencil的文件可能内容如下li idtask-{ID} classtask-item hx-get/task/{ID}/edit hx-target#task-{ID} span classtask-text{TEXT}/span button hx-post/task/{ID}/toggle hx-swapouterHTML✓/button /li这里的{ID}、{TEXT}是占位符由 Delphi 在运行时用真实数据填充。关键在于hx-get和hx-post属性已预先写死开发者只需关注“用什么数据填什么位置”无需再思考“这个按钮点一下该发什么请求”。在 RAD Studio 的TWebModule设计器中你可以将这类 stencil 文件作为资源嵌入项目然后在OnAction事件中用TStringList.LoadFromFile()读取再用StringReplace()替换占位符最后赋值给Response.Content。这比手写Format(li idtask-%d%s/li, [AID, AText])更易维护尤其当模板变复杂含条件渲染、循环嵌套时。2.3 HTMX 与 WebBroker 的生命周期对齐从 Request 到 Response 的完整链路一个典型的 HTMX 请求在 Delphi WebBroker 中的流转远比普通页面请求更“瘦”浏览器发起用户点击a hx-get/api/tasks?statusactiveHTMX 库捕获 click 事件构造 GET 请求/api/tasks?statusactive。WebBroker 接收TWebModule的OnAction事件被触发Request.PathInfo /api/tasksRequest.QueryFields.Values[status] active。Delphi 处理开发者在OnAction中根据QueryFields参数查询数据库生成任务列表 HTML 片段非完整 HTML 文档。响应输出Response.ContentType : text/html; Response.Content : GeneratedHTMLFragment;。注意Response.Content必须是纯 HTML 片段不能包含html、body标签否则 HTMX 会因解析失败而静默失败。HTMX 渲染浏览器收到响应后HTMX 库解析 HTML按hx-target定位 DOM按hx-swap规则插入内容整个过程无页面刷新。这个链路清晰表明HTMX 不是客户端框架而是服务端与客户端之间的一条“语义化协议”。Delphi 开发者的工作重心从“写 JS 控制 DOM”彻底转向“写 Pascal 生成精准 HTML 片段”。3. WebStencils 模板引擎集成用语法实现服务端逻辑注入告别字符串拼接WebStencils 的核心价值在于它提供了一套轻量级、Delphi 友好的模板语法让 HTML 片段的生成摆脱了脆弱的StringReplace和易出错的Format。手册第 05、06 章详细描述的符号体系本质上是一个运行在 Delphi 服务端的微型模板引擎其设计哲学是“最小侵入”——不引入新语言只扩展 HTML 注释和属性所有逻辑最终都编译为 Pascal 代码执行。这意味着你可以在.stencil文件里写if Status active then begin ... end而 Delphi 编译器会把它翻译成真正的if语句。这种服务端模板与客户端 JS 框架的虚拟 DOM 渲染有本质区别它不增加客户端负担所有条件判断、循环、数据访问都在服务器完成返回给浏览器的永远是最终渲染好的 HTML。3.1 WebStencils 核心语法在 Delphi 中的落地实现手册中提到的语法并非凭空而来它需要 Delphi 开发者在TWebModule中集成一个解析器。常见做法是使用TStringList加正则表达式预处理或采用更健壮的TTemplateEngine类手册附录提供了简化版。以下是关键语法的 Delphi 实现逻辑page声明当前模板的上下文对象类型。例如page TTaskPage告诉解析器后续query、if中的字段都来自TTaskPage实例。在 Delphi 端你需要定义TTaskPage class(TObject) public TaskID: Integer; TaskText: string; Status: string; end;并在OnAction中创建其实例并传入模板引擎。query用于访问 URL 查询参数。divquery(status)/div在 Delphi 中会被替换为AContext.Status假设TTaskPage有Status属性。实际代码中解析器会查找Request.QueryFields并安全提取值自动处理空值和编码。if/else服务端条件渲染。if Status active then begin span classactive.../span end else begin span classinactive.../span end。解析器会将其转换为 Pascal 的if语句块确保只有满足条件的 HTML 被生成。ForEach服务端循环。ForEach Tasks as Task do begin liTask.Text/li end。解析器会遍历Tasks: TListTTask为每个Task实例生成一次li。这比在 Pascal 里写for i : 0 to Tasks.Count - 1 do ...更直观且 HTML 结构与逻辑分离。3.2 使用AddVar向模板注入动态数据从硬编码到松耦合AddVar是 WebStencils 与 Delphi 数据层对接的桥梁。它不是一个全局函数而是模板引擎实例的一个方法用于在渲染前将 Pascal 对象或基本类型绑定到模板上下文。例如// 在 TWebModule.OnAction 事件中 var LPage: TTaskPage; LTemplate: TWebStencilsEngine; begin LPage : TTaskPage.Create; try LPage.TaskID : StrToIntDef(Request.QueryFields.Values[id], 0); LPage.TaskText : GetTaskText(LPage.TaskID); // 从数据库查 LPage.Status : GetTaskStatus(LPage.TaskID); LTemplate : TWebStencilsEngine.Create; try // 将 LPage 对象绑定为模板的上下文 LTemplate.AddVar(Page, LPage); // 将一个字符串数组绑定供 ForEach 使用 LTemplate.AddVar(Categories, GetCategoryList()); // 加载 stencil 文件 LTemplate.LoadFromFile(task-detail.stencil); // 渲染并输出 Response.Content : LTemplate.Render; finally LTemplate.Free; end; finally LPage.Free; end; end;这段代码的关键在于AddVar(Page, LPage)。它让 stencil 文件中的Page.TaskText能直接访问LPage.TaskText的值。AddVar的第二个参数可以是任何TObject子类、string、Integer、TList等模板引擎会通过 RTTI运行时类型信息自动反射其属性和方法。这是实现“HTML 模板与 Pascal 业务逻辑解耦”的核心技术。3.3LayoutPage与RenderBody构建可复用的页面骨架大型应用需要统一的布局header、nav、footerWebStencils 通过LayoutPage和RenderBody实现“模板继承”。其工作原理是主布局模板如main-layout.stencil定义骨架其中包含RenderBody占位符具体内容模板如task-list.stencil则通过LayoutPage main-layout.stencil声明自己要套用该布局。在 Delphi 端模板引擎会先加载内容模板再加载布局模板将内容模板的渲染结果作为RenderBody的值注入布局中。// main-layout.stencil !DOCTYPE html html headtitlePage.Title/title/head body headerMy App/header mainRenderBody/main !-- 此处将被 task-list.stencil 的内容替换 -- footercopy; 2024/footer /body /html // task-list.stencil LayoutPage main-layout.stencil page TTaskListPage h1Page.Title/h1 ul ForEach Page.Tasks as Task do begin liTask.Text/li end /ul在 Delphi 代码中你只需调用LTemplate.LoadFromFile(task-list.stencil)引擎会自动识别LayoutPage并完成嵌套渲染。这避免了在每个OnAction中重复写 header/footer HTML大幅提升可维护性。4. 避坑HTMX WebStencils 在 Delphi 12 中的五个高频翻车点与血泪修复方案即使文档再详尽实操中总有些坑是手册里没写的只有亲手部署过三遍以上才刻进 DNA。以下是我在线上环境踩过的五个典型问题每个都附带现象、根因和可立即生效的修复命令/代码。4.1 现象HTMX 请求发出但浏览器 Network 面板显示 404TWebModule的OnAction完全没被触发原因TWebActionItem的PathInfo设置错误未匹配 HTMX 发出的请求路径。常见错误是hx-get/api/tasks但TWebActionItem.PathInfo设成了/tasks少了/api前缀或大小写不一致如PathInfo /API/tasks但请求是/api/tasks。解决在TWebModule的OnCreate事件中添加日志输出所有注册的TWebActionItem路径确认是否精确匹配procedure TWebModule1.WebModuleCreate(Sender: TObject); var I: Integer; begin for I : 0 to WebActionItems.Count - 1 do WriteToLog(Registered Action: WebActionItems.Items[I].PathInfo); end;同时检查TWebModule的DefaultHandler是否被意外启用它会劫持所有未匹配的请求。确保DefaultHandler的PathInfo为空或设为*且OnAction仅作兜底处理。4.2 现象HTMX 成功获取响应但目标元素 (hx-target) 内容空白或整个页面被替换成一片白原因Response.Content返回了完整 HTML 文档含htmlbody标签而 HTMX 默认期望纯 HTML 片段。当 HTMX 解析到html标签时会因不符合片段规范而丢弃整个响应。解决强制在OnAction中设置Response.ContentType : text/html并确保Response.Content只包含片段 HTML。添加防御性检查// 在设置 Response.Content 前 if Pos(html, GeneratedHTML) 0 then WriteToLog(ALERT: Response contains full HTML document! Check template output.); Response.Content : GeneratedHTML; // GeneratedHTML 必须是 div.../div 或 li.../li 等片段4.3 现象ForEach循环不渲染或报EAccessViolation错误原因AddVar绑定的集合对象如TListTTask在模板渲染过程中被释放或集合本身为nil。WebStencils 引擎在反射访问时尝试读取已释放内存。解决在AddVar前确保集合对象生命周期覆盖整个渲染过程并做空值检查// 错误LTasks 可能在 AddVar 后被 Free LTasks : GetTaskList(); LTemplate.AddVar(Tasks, LTasks); LTasks.Free; // 危险渲染时 LTasks 已释放 // 正确用 try..finally 确保 LTasks 在渲染完成后才释放 LTasks : GetTaskList(); try LTemplate.AddVar(Tasks, LTasks); Response.Content : LTemplate.Render; finally LTasks.Free; // 渲染完毕后释放 end;同时在 stencil 中添加if Assigned(Tasks) and (Tasks.Count 0) then begin ... end。4.4 现象hx-post表单提交后Request.ContentFields为空无法获取表单数据原因表单enctype属性未设为application/x-www-form-urlencoded默认值或设为了multipart/form-data用于文件上传但ContentFields只解析前者。HTMX 默认使用application/x-www-form-urlencoded但如果表单手动设置了enctypemultipart/form-data则ContentFields为空需改用Request.Files。解决检查表单 HTML确保无enctype属性或显式设为form hx-post/save enctypeapplication/x-www-form-urlencoded input nametitle valuetest button typesubmitSave/button /form在 Delphi 端用Request.ContentFields.Values[title]获取值。若必须用multipart/form-data则需改用Request.Files并手动解析。4.5 现象query(param)返回空字符串但 URL 中明明有?paramvalue原因query解析的是Request.QueryFields而某些部署环境如 IIS 反向代理可能修改了原始 URL导致QueryFields未被正确填充。或者TWebModule的OnAction事件未在mtGet方法下注册导致 GET 请求被忽略。解决首先确认TWebActionItem.MethodType设为mtGet其次在OnAction中直接打印Request.RawHTTP和Request.QueryFields.Text进行调试WriteToLog(RawHTTP: Request.RawHTTP); WriteToLog(QueryFields: Request.QueryFields.Text);如果QueryFields.Text为空说明请求未被 WebBroker 正确解析需检查 Web 服务器配置如 IIS 的 ISAPI 筛选器、Apache 的 mod_isapi 加载顺序。5. 安全加固在 HTMX WebStencils 场景下CSRF、XSS 与数据验证的 Delphi 实战守则HTMX 的声明式特性让前端交互变得极其简洁但也放大了安全风险——因为所有请求都源于 HTML 属性攻击者更容易通过篡改hx-get或hx-post的 URL 来发起非法请求。Delphi WebBroker 本身不内置 CSRF Token 或 XSS 过滤必须由开发者在TWebModule层主动植入。手册第 02 章的安全章节提到了要点但没给出可粘贴的代码。以下是我在线上系统中验证过的、零依赖的加固方案。5.1 CSRF 保护用TSession生成并校验一次性 TokenHTMX 请求与普通表单提交一样会携带 Cookie因此可利用TSession存储服务端生成的 Token。关键在于Token 必须随每个hx-post表单一起发送并在 Delphi 端严格校验。步骤 1在主页面模板中注入 Token在生成主 HTML 页面非 HTMX 片段的TWebActionItem中生成 Token 并存入 Sessionprocedure TWebModule1.MainPageAction(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); var LToken: string; begin LToken : GenerateCSRFToken(); // 自定义函数如 MD5(Now Random) Request.Session.SetValue(CSRF_TOKEN, LToken); Response.Content : Format(html...form hx-post/save hx-headers{ X-CSRF-Token: %s }input namedata/form.../html, [LToken]); end;步骤 2在 HTMX 处理器中校验 Token在/save的TWebActionItemmtPost中从 Header 或 Form 字段读取 Token 并比对procedure TWebModule1.SaveAction(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); var LTokenFromHeader, LTokenFromSession: string; begin LTokenFromHeader : Request.GetFieldByName(X-CSRF-Token); // HTMX 通过 hx-headers 发送 LTokenFromSession : Request.Session.GetValue(CSRF_TOKEN); if (LTokenFromHeader ) or (LTokenFromHeader LTokenFromSession) then begin Response.StatusCode : 403; Response.Content : Forbidden: Invalid CSRF Token; Exit; end; // Token 校验通过继续业务逻辑 SaveData(Request.ContentFields); end;注意hx-headers是 HTMX 的高级属性允许在请求头中添加自定义字段。X-CSRF-Token是业界通用命名确保与后端校验一致。5.2 XSS 防御对所有模板输出进行 HTML 实体编码WebStencils 的Page.Title若直接输出用户输入的内容如scriptalert(1)/script将导致存储型 XSS。解决方案不是禁用而是对所有动态输出进行编码。Delphi 自带HTMLEncode函数在HTTPApp单元但需在模板引擎中集成。修改模板引擎的Render方法在解析表达式并获取值后自动调用HTMLEncode// 伪代码模板引擎内部逻辑 function TWebStencilsEngine.EvaluateExpression(const AExpr: string): string; var LValue: string; begin LValue : GetRuntimeValue(AExpr); // 从 Page 对象或 QueryFields 获取原始值 Result : HTMLEncode(LValue); // 关键强制 HTML 编码 end;这样无论Page.Title的值是什么输出到 HTML 中的都是安全的实体编码如变成lt;。对于需要原样输出 HTML 的场景如富文本编辑器内容可提供raw语法但必须由开发者显式调用且文档中重点警告风险。5.3 数据验证在TWebActionItem入口处做“守门员”式校验HTMX 让请求无处不在因此验证不能只放在业务逻辑深处必须在OnAction入口就拦截非法输入。手册强调“数据验证”但没给具体模式。我采用的是“白名单 类型强转”策略procedure TWebModule1.TaskUpdateAction(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); var LID: Integer; LStatus: string; begin // 1. ID 必须是正整数 LID : StrToIntDef(Request.QueryFields.Values[id], -1); if LID 0 then begin Response.StatusCode : 400; Response.Content : Bad Request: Invalid ID; Exit; end; // 2. Status 必须是预定义枚举值 LStatus : Request.ContentFields.Values[status]; if not (LStatus in [active, completed, deleted]) then begin Response.StatusCode : 400; Response.Content : Bad Request: Invalid status; Exit; end; // 3. 所有验证通过才进入业务层 UpdateTaskStatus(LID, LStatus); Response.Content : span classsuccessUpdated!/span; end;这种“守门员”模式让非法请求在第一毫秒就被拒绝不消耗数据库连接也不执行任何业务代码是性能与安全的双重保障。6. 进阶技巧用 WebStencils 的Scaffolding和LoginRequired实现零配置 CRUD 与权限熔断手册第 08 章提到的Scaffolding和LoginRequired是 WebStencils 最被低估的两个高级特性。它们不是炫技功能而是能帮你省掉 70% 模板代码的生产力核弹。Scaffolding的本质是根据 Pascal 类的 RTTI运行时类型信息自动生成 CRUD 表单和列表LoginRequired则是在模板层实现声明式权限控制比在每个OnAction里写if not IsUserLoggedIn then ...干净十倍。这两个特性让 Delphi WebBroker 开发真正具备了现代框架的“约定优于配置”气质。6.1Scaffolding从TTask类定义一键生成管理界面假设你有一个标准的TTask类type TTask class(TObject) private FID: Integer; FTitle: string; FStatus: string; public property ID: Integer read FID write FID; property Title: string read FTitle write FTitle; property Status: string read FStatus write FStatus; end;在task-list.stencil中你只需写Scaffolding TTask list Scaffolding TTask formWebStencils 引擎会自动扫描TTask的所有 published 属性为list模式生成table每列对应一个属性表头为属性名可本地化为form模式生成form每个属性生成labelinputtype根据属性类型智能推断Integer→numberstring→textTDateTime→datetime-local自动生成hx-post提交地址和hx-target指向标准 RESTful 路径如/task/123。在 Delphi 端你只需在OnAction中提供数据源procedure TWebModule1.ScaffoldAction(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); var LTasks: TListTTask; begin LTasks : GetTaskList(); // 返回 TListTTask LTemplate.AddVar(Data, LTasks); LTemplate.AddVar(ModelType, TTask); Response.Content : LTemplate.Render; end;引擎会根据ModelType反射TTask并用Data列表渲染Scaffolding。这让你在新增一个实体类后5 分钟内就能拥有完整的增删改查界面而无需手写任何 HTML。6.2LoginRequired模板层的权限熔断开关LoginRequired不是简单的if not LoggedIn then Hide而是一种声明式权限模型。它要求你在TWebModule中实现一个IsUserAuthorized函数该函数接收资源路径和动作如task,edit返回布尔值。然后在 stencil 中!-- 只有有 edit 权限的用户才能看到编辑按钮 -- LoginRequired task edit button hx-get/task/Page.ID/edit hx-target#modalEdit/button !-- 只有管理员才能看到删除按钮 -- LoginRequired admin full button hx-delete/task/Page.ID hx-confirmDelete this task?Delete/button在 Delphi 端LoginRequired的解析器会调用你的授权函数function TWebModule1.IsUserAuthorized(const AResource, AAction: string): Boolean; begin Result : False; if AResource task then begin if AAction edit then Result : (Request.Session.GetValue(UserRole) editor) or (Request.Session.GetValue(UserRole) admin); end else if AResource admin then begin if AAction full then Result : Request.Session.GetValue(UserRole) admin; end; end;这种设计让权限逻辑集中在一处IsUserAuthorized而 UI 模板只负责声明“这里需要什么权限”彻底解耦。当权限规则变更时你只需修改IsUserAuthorized所有LoginRequired标记的 UI 元素会自动生效无需逐个修改 stencil 文件。6.3Import与ExtraHeaders构建模块化、可组合的模板生态大型项目中stencil 文件会越来越多。Import允许你像 Pascal 单元一样uses其他 stencil实现代码复用。例如common-components.stencil定义了!-- common-components.stencil -- def alert-box div classalert Param(type) Param(message) /div enddef在task-detail.stencil中你可以Import common-components.stencil alert-box(typeerror, messageTask not found!)ExtraHeaders则用于在 HTMX 请求中注入全局 Header如认证 TokenExtraHeaders { Authorization: Bearer Request.Session.GetValue(AuthToken) }这比在每个hx-get上手动写hx-headers更可靠避免遗漏。从那以后我每次新建一个 WebBroker 项目都会先建一个stencil文件夹把Scaffolding模板、LoginRequired授权函数、ExtraHeaders初始化逻辑全部封装好形成团队内部的“Delphi Web Starter Kit”。它让我在客户现场演示时能当场根据需求画一个类图10 分钟内就跑出可操作的 Web 界面——不是 PPT是真能点、能输、能存的原型。这种把 RAD 理念贯彻到 Web 层的踏实感是任何前端框架都给不了的。希望帮到你。本文还有配套的精品资源点击获取
RELATED

相关推荐

微软MAI-Image-2技术解析:照片级AI生图突破与应用

微软MAI-Image-2技术解析:照片级AI生图突破与应用

1. 微软MAI-Image-2技术解析:照片级写实生图如何实现行业突破当微软研究院在计算机视觉顶会CVPR 2023的workshop上首次展示MAI-Image-2的生成样本时,现场研究者们传阅的手机屏幕上,那些真假难辨的人像照片引发了持续讨论。这个基于扩散模型架…

📅 2026/10/29 21:13:54
智慧农业生菜生长状态检测数据集解析与应用

智慧农业生菜生长状态检测数据集解析与应用

1. 项目概述:智慧农业生菜生长状态检测数据集 这个数据集是专门为智慧农业场景下生菜生长状态检测任务设计的标准化数据资源包。它包含了4406张高质量的生菜生长过程图像,采用VOC和YOLO两种主流标注格式,覆盖了生菜生长周期的3个关键状态类别…

📅 2026/10/29 21:13:54
OpenSSL ENGINE机制解析:如何实现加密算法透明替换

OpenSSL ENGINE机制解析:如何实现加密算法透明替换

简介:这份文档面向需要理解 OpenSSL 扩展加密能力的开发者与安全工程师,聚焦 ENGINE 机制这一通用加密接口的设计与实现,帮助读者弄清 OpenSSL 如何透明调用第三方软件加密库或硬件加密设备,适合具备一定密码学基础、希望深入 Ope…

📅 2026/10/29 21:08:53
MORE NEWS

更多资讯

📰

平均数与中位数:工资分布偏斜下的数据分析与分位数应用

做数据分析这些年,被问得最多的一类问题是:“这个数看着挺高的,为什么大家体感完全不一样?”十次里有八次,问题出在同一个地方——拿平均数当成了全部人的代表值。尤其在看工资分布这类明显偏斜的数据时,平…

📰

ponytail方法论:一种面向可操作性的工程化极简实践

1. 项目概述:从“ponytail”这个词开始,我们到底在聊什么?“ponytail”这个词最近在多个平台的搜索趋势里突然抬头,不是因为某部老电影重映,也不是某位明星扎了个新发型——它正悄然脱离字面意义,在中文互联…

📰

Excel两个表并排显示:分屏、同步滚动与冻结窗格实操指南

1. 先把"并排"这件事拆开看:三种并排,九成人搞混1.1 你以为的并排,和软件实际做的并排先说结论:在Excel里说"两个表并排显示",实际对应的是三件完全不同的事,选错了方法,你…

📰

电路阻抗解析:从RC/RLC频响到阻抗匹配与测量

做硬件这行,绕不开一个词——阻抗。刚入行那会儿,我把它当成"电阻的高级说法",直到有一次调试一个分压采样电路,直流算得严丝合缝,上电后波形却软塌塌地塌下去一角,换了三个电阻、两块板子&#…

📰

AI编译器与MLIR技术:深度学习模型部署优化指南

1. 现代AI编译器技术全景解析 在深度学习模型部署领域,我们正面临着一个关键矛盾:算法迭代速度与硬件碎片化程度都在指数级增长。PyTorch和TensorFlow等框架训练的模型需要适配从云端GPU集群到边缘端ARM芯片等各类硬件平台,传统手工优化方式已…

📰

系统动力学建模知识地图:反馈结构、仿真流程与复习清单

简介:这份PPT课件面向管理学、系统工程与经济学等专业的学习者,以及需要处理复杂反馈问题的研究与决策人员,系统梳理系统动力学的学科脉络与分析方法,帮助读者建立从因果环路到仿真建模的整体认知。内容以Forrester的工业动力学、…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬