You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 23:27:28