Smartstore Widget与Block开发:两大前端扩展点一次学会
【免费下载链接】SmartstoreA modular, scalable and ultra-fast open-source all-in-one eCommerce platform built on ASP.NET Core 10项目地址: https://gitcode.com/GitHub_Trending/smar/Smartstore
Smartstore 是基于 ASP.NET Core 10 构建的模块化、可扩展且极速的开源一体化电商平台。它的Widget(挂件)与 Block(内容块)正是两大核心前端扩展点:Widget 可以把内容注入页面任意"插槽区(Widget Zone)",Block 则让运营人员在 Page Builder(页面构建器)中像搭积木一样可视化搭建页面。本文带你一次学会这两大扩展机制的用法与选型。
一、先搞懂:Widget 和 Block 各解决什么问题?
| 对比维度 | Widget(挂件) | Block(内容块) |
|---|---|---|
| 谁在操作 | 开发者(代码注入) | 运营人员(后台拖拽) |
| 注入位置 | 视图模板中预定义的 Widget Zone | Page Builder 的响应式网格 |
| 典型场景 | 页头脚本、扩展导航、自定义侧边栏、购物车附加内容 | 图文卡片、HTML 片段、商品列表、Iframe 等页面故事(Story) |
| 是否需要写代码 | 需要 | 使用内置 Block 不需要,开发自定义 Block 需要 |
一句话区分:Widget 是"往页面里塞东西"的钩子,Block 是"让运营自己排版"的积木。两者的底层其实是相通的——Block 最终也可以渲染成 Widget 输出。
二、Widget 扩展点:三步注入内容到 Widget Zone
1. 认识 Widget Zone(插槽区)
Smartstore 的视图模板中散布着成百上千个 Widget Zone,覆盖页头/页脚、导航栏、商品详情页、账户菜单、结账流程等位置。所有核心 Zone 名称都记录在 widgetzones.json 中,例如:
header_before/footer_before:页头、页脚区域productdetails_pictures_top:商品图片上方home_page_after_intro:首页介绍之后
想在自己的视图中开一个新插槽,只需一行 Zone Tag Helper:
<zone name="my_custom_zone" />小技巧:安装Smartstore Developer Tools插件后开启"Display Widget Zones"选项,就能在前台页面直接看到所有插槽的位置。
2. 三种 Widget 类型
Smartstore 用统一的 Widget 抽象整合了 ASP.NET Core 的三种内容源:
ComponentWidget:调用并渲染 View Component(最常用)PartialViewWidget:渲染局部视图(partial view)HtmlWidget:渲染任意 HTML 内容
3. 注册并启用 Widget
最推荐的注册方式是请求级服务 IWidgetProvider——在过滤器或事件中调用RegisterWidget,即可把 Widget 实例挂到指定 Zone。另一种经典做法是让模块实现 IActivatableWidget 接口(静态 Widget 提供者),在GetWidgetZones中声明目标插槽、在GetDisplayWidget中返回要渲染的内容。
⚠️新手最容易踩的坑:静态 Widget 必须在后台CMS / Widgets中手动激活,否则不会渲染。完整教程见 creating-a-widget-provider.md。
三、Block 扩展点:让运营自己搭建页面
Page Builder 允许编辑者在响应式网格上排列内容块,组成一篇篇"Story(故事页)"并存储到数据库,最终渲染到你配置的 Widget Zone。
1. Block 的三大构件
每个自定义 Block 由三部分构成(核心接口见 IBlock.cs):
- Block 模型:实现
IBlock接口,定义设置项,就像普通 Model 一样 - BlockHandler:继承 BlockHandlerBase,用
[Block]特性声明系统名、显示名称和图标,驱动加载、保存与渲染 - 模板视图:放在模块的
Views/Shared/BlockTemplates/<系统名>/目录下Edit.cshtml——后台配置表单Public.cshtml——前台输出Preview.cshtml——(可选)编辑器网格中的轻量预览
一个最简 Block 只有寥寥几行:空 Handler 加上一个带属性的模型类即可被 Page Builder 识别并出现在面板中。带完整注释的示例可直接参考 SampleBlock.cs。
2. 四种视图模式 StoryViewMode
在 Handler 的Load方法中,可以根据StoryViewMode区分四种场景:Edit(编辑属性)、GridEdit(网格排列)、Preview(预览 Story)、Public(前台发布),从而为不同场景输出不同内容。
3. 进阶能力
- 数据绑定:实现
IBlock的IBindableBlock变体,可将 Block 绑定到商品、分类等实体,让模板自动映射实体字段 - Widget 输出:重写 Handler 的
RenderCoreAsync与GetWidget,让 Block 直接渲染一个 View Component,打通 Block 与 Widget 两大体系
四、如何选择:一张表定方案
| 你的需求 | 推荐扩展点 |
|---|---|
| 给页面注入统计脚本、扩展导航菜单、自定义侧边栏 | ✅ Widget |
| 运营人员可自助更新的活动页、图文卡片 | ✅ Block(Page Builder) |
| 需要按商品/分类数据驱动展示 | ✅ Block + 数据绑定,或 Widget + View Component |
| 内容需要后台可视化拖拽排序 | ✅ Block(Widget 不支持拖拽排版) |
经验法则:开发者主导、位置固定 → 用 Widget;运营主导、内容频繁变化 → 用 Block;复杂场景则用 Block 包 Widget,二者组合拳。
五、学习与导航清单 📌
官方文档
- Widget 完整指南:dev-docs/framework/content/widgets.md
- Page Builder 与 Block 架构:dev-docs/framework/content/page-builder-and-blocks.md
- 手把手 Widget 教程:dev-docs/compose/modules/examples/creating-a-widget-provider.md
- 手把手 Block 教程:dev-docs/compose/modules/examples/creating-a-block.md
核心源码
- Widget 抽象:src/Smartstore.Core/Platform/Widgets/
- Block 接口与 Handler:src/Smartstore.Core/Content/Blocks/
- 内置示例 Block:src/Smartstore.Modules/Smartstore.DevTools/Blocks/SampleBlock.cs
上手三步走
- 用 DevTools 插件在前台标出 Widget Zones,确认注入位置
- 按 Widget 教程注入第一个
ComponentWidget,并在 CMS / Widgets 中激活 - 参考
SampleBlock开发一个自定义 Block,在 Page Builder 中拖拽使用
掌握 Widget 与 Block,你就掌握了 Smartstore 前端扩展的两大支点——一个负责"精确注入",一个负责"自由搭建",组合使用即可覆盖绝大多数定制需求。
【免费下载链接】SmartstoreA modular, scalable and ultra-fast open-source all-in-one eCommerce platform built on ASP.NET Core 10项目地址: https://gitcode.com/GitHub_Trending/smar/Smartstore
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考