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

如何在Umbraco 9/10中覆盖内置Umbraco.Tags属性编辑器的addTag函数?

解决Umbraco 10内置Tags编辑器大小写敏感问题的两种方案

方案1:自定义属性编辑器替换内置Tags编辑器

直接复用内置编辑器的视图和配置,仅修改标签添加逻辑来实现大小写不敏感:

  1. 创建插件目录与Manifest文件
    在项目根目录下新建App_Plugins/TagsCaseInsensitive文件夹,创建package.manifest:
{
  "propertyEditors": [
    {
      "alias": "Umbraco.Tags.CaseInsensitive",
      "name": "Tags (Case Insensitive)",
      "editor": {
        "view": "~/App_Plugins/TagsCaseInsensitive/tags.html",
        "controller": "Umbraco.PropertyEditors.TagsCaseInsensitiveController"
      },
      "prevalues": {
        "view": "tags/prevalues"
      },
      "isParameterEditor": true
    }
  ],
  "javascript": [
    "~/App_Plugins/TagsCaseInsensitive/tags.controller.js"
  ]
}

这里复用内置Tags的预配置视图,保证编辑器配置项和原生一致。

  1. 复制内置视图文件
    从Umbraco源码中找到内置Tags编辑器的视图(路径:Umbraco.Web.UI.Client/src/views/propertyeditors/tags/tags.html),复制到App_Plugins/TagsCaseInsensitive目录下,无需修改任何内容。

  2. 编写自定义控制器覆盖添加逻辑
    创建tags.controller.js,继承内置控制器并修改addTag函数:

angular.module("umbraco")
    .controller("Umbraco.PropertyEditors.TagsCaseInsensitiveController", 
    ["$scope", "$controller", "eventsService", "localizationService", "editorService",
    function ($scope, $controller, eventsService, localizationService, editorService) {

        // 复用内置Tags控制器的全部原有逻辑
        angular.extend(this, $controller('Umbraco.PropertyEditors.TagsController', { 
            $scope: $scope, 
            eventsService: eventsService, 
            localizationService: localizationService, 
            editorService: editorService 
        }));

        // 覆盖addTag方法,实现大小写不敏感检查
        var originalAddTag = $scope.addTag;
        $scope.addTag = function(tag) {
            if (!tag) return;
            // 统一转为小写(也可改为大写,保持一致即可)
            var normalizedTag = tag.trim().toLowerCase();
            // 检查现有标签中是否已存在同内容(忽略大小写)的标签
            var tagExists = $scope.tags.some(function(existingTag) {
                return existingTag.toLowerCase() === normalizedTag;
            });
            if (!tagExists) {
                originalAddTag(normalizedTag);
            } else {
                // 复用内置提示告知用户标签已存在
                localizationService.localize("tags_tagExists").then(function (value) {
                    editorService.info({
                        title: value,
                        view: "views/common/infiniteeditors/infodialog.html",
                        size: "small"
                    });
                });
            }
        };
    }]);
  1. 替换文档类型中的属性编辑器
    进入Umbraco后台,找到使用原生Tags编辑器的属性,将其编辑器切换为我们创建的Tags (Case Insensitive),保存配置即可生效。

方案2:服务器端事件统一处理标签大小写

如果不想修改前端编辑器,可在内容保存时自动标准化标签格式,从根源解决问题:

  1. 创建内容保存事件处理器
using Umbraco.Cms.Core.Events;
using Umbraco.Cms.Core.Models;
using Umbraco.Cms.Core.Notifications;
using Umbraco.Extensions;

namespace YourProjectNamespace
{
    public class TagsCaseNormalizationHandler : INotificationHandler<ContentSavingNotification>
    {
        public void Handle(ContentSavingNotification notification)
        {
            foreach (var content in notification.SavedEntities)
            {
                // 遍历所有属性,筛选出Tags类型的属性
                foreach (var property in content.Properties)
                {
                    if (property.PropertyType.EditorAlias.Equals("Umbraco.Tags", StringComparison.InvariantCultureIgnoreCase))
                    {
                        var tagsValue = property.GetValue() as string;
                        if (!string.IsNullOrEmpty(tagsValue))
                        {
                            // 分割标签、统一小写、去重后重新拼接
                            var normalizedTags = tagsValue.Split(',')
                                .Select(t => t.Trim().ToLower())
                                .Distinct()
                                .Join(",");
                            property.SetValue(normalizedTags);
                        }
                    }
                }
            }
        }
    }
}
  1. 注册事件处理器
    在Startup.cs所在目录创建Composer类:
using Umbraco.Cms.Core.Composing;
using Umbraco.Cms.Core.DependencyInjection;

namespace YourProjectNamespace
{
    public class TagsComposer : IComposer
    {
        public void Compose(IUmbracoBuilder builder)
        {
            builder.AddNotificationHandler<ContentSavingNotification, TagsCaseNormalizationHandler>();
        }
    }
}

此方法无需修改前端,所有内容保存时都会自动将标签转为小写并去重。


你之前尝试失败的可能原因

  • Manifest文件配置错误:别名、路径或依赖项设置不正确
  • 未复用内置预配置视图:导致编辑器缺失原生配置项
  • 未正确继承内置控制器逻辑:自定义编辑器功能不全无法正常关联

内容的提问来源于stack exchange,提问作者Melkweg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 08:32:42