Kentico 12迁移至13 MVC Core:用户控件选择小部件复刻方案咨询
替代Kentico 12「Control Wrapper」小部件的Kentico 13 MVC实现方案
核心思路
Kentico 13 MVC中没有Web Forms的.ascx用户控件,核心替代方向是用**视图组件(View Components)或部分视图(Partial Views)**封装可复用UI逻辑,再通过自定义小部件让编辑器选择对应组件,完全匹配你原来的「选择组件+加载渲染+CRM交互」需求。
方案一:视图组件(View Components)实现(推荐)
视图组件是MVC中封装独立UI逻辑的标准方案,和原.ascx控件的逻辑模式最贴合,适合需要独立处理CRM API调用(读/写数据)的场景。
1. 迁移原.ascx逻辑到视图组件
把每个.ascx的CRM交互、数据处理逻辑封装成视图组件:
// 示例:客户信息视图组件 public class CustomerInfoViewComponent : ViewComponent { private readonly ICrmApiService _crmApiService; // 依赖注入CRM API服务(抽离原ascx中的API调用逻辑为独立服务) public CustomerInfoViewComponent(ICrmApiService crmApiService) { _crmApiService = crmApiService; } // 渲染组件时获取CRM数据 public async Task<IViewComponentResult> InvokeAsync(int customerId) { var customerData = await _crmApiService.GetCustomerById(customerId); return View(customerData); } // 处理CRM数据更新(配合前端AJAX调用) [HttpPost] public async Task<IActionResult> UpdateCustomer(CustomerUpdateModel model) { var success = await _crmApiService.UpdateCustomer(model); return Json(new { Success = success }); } }
对应的UI视图放在/Views/Shared/Components/CustomerInfo/Default.cshtml,编写页面结构和AJAX提交逻辑即可。
2. 自定义小部件实现组件选择
创建替代原「File System Selector」的小部件,让编辑器选择要加载的视图组件:
- 定义小部件属性类:
public class ComponentWrapperWidgetProperties : IWidgetProperties { // 下拉选择预定义的视图组件,也可通过代码动态扫描组件列表 [EditingComponent(DropDownComponent.IDENTIFIER, Order = 0)] [EditingComponentProperty(nameof(DropDownProperties.DataSource), "CustomerInfo|客户信息组件\nOrderHistory|订单历史组件")] public string SelectedComponentName { get; set; } // 组件所需参数,比如客户ID(根据实际需求添加) [EditingComponent(IntegerInputComponent.IDENTIFIER, Order = 1)] public int CustomerId { get; set; } }
- 小部件视图动态渲染选中的组件:
@model ComponentWrapperWidgetProperties @if (!string.IsNullOrEmpty(Model.SelectedComponentName)) { // 根据选择的组件名称调用对应视图组件 await Component.InvokeAsync(Model.SelectedComponentName, new { customerId = Model.CustomerId }); }
最后在Kentico后台注册该小部件,分配给对应页面类型即可。
方案二:部分视图(Partial Views)实现
如果原.ascx逻辑较简单,也可以用部分视图封装,适合不需要独立控制器逻辑的场景。
1. 迁移原.ascx到部分视图
把原.ascx的UI和简单逻辑迁移到/Views/Shared/Partials/目录下的.cshtml文件,比如CustomerInfoPartial.cshtml,API调用逻辑可通过依赖注入的服务实现。
2. 自定义小部件选择部分视图
类似方案一,小部件属性添加部分视图选择项:
public class PartialWrapperWidgetProperties : IWidgetProperties { [EditingComponent(DropDownComponent.IDENTIFIER, Order = 0)] [EditingComponentProperty(nameof(DropDownProperties.DataSource), "CustomerInfoPartial|客户信息\nOrderHistoryPartial|订单历史")] public string SelectedPartialName { get; set; } public int CustomerId { get; set; } }
小部件视图渲染部分视图:
@model PartialWrapperWidgetProperties @if (!string.IsNullOrEmpty(Model.SelectedPartialName)) { await Html.RenderPartialAsync($"~/Views/Shared/Partials/{Model.SelectedPartialName}.cshtml", new { CustomerId = Model.CustomerId }); }
额外实用建议
- API逻辑复用:把原
.ascx中的CRM REST API调用代码抽离为独立服务类(比如ICrmApiService),通过依赖注入在视图组件/部分视图中使用,避免重复代码。 - 动态组件扫描:如果组件数量多,可编写代码扫描指定目录下的视图组件/部分视图,自动生成小部件的下拉选项数据源,不用手动维护。
- 权限控制:原控件的访问权限限制,可通过Kentico小部件的权限设置,或在视图组件中添加权限校验逻辑。
- 分批迁移:先选一个简单的
.ascx控件做迁移测试,验证API交互和UI渲染正常后,再批量迁移其他组件。
内容的提问来源于stack exchange,提问作者Anne Kercher
相关产品推荐
相关产品推荐

