如何在Umbraco 9/10中覆盖内置Umbraco.Tags属性编辑器的addTag函数?
方案1:自定义属性编辑器替换内置Tags编辑器
直接复用内置编辑器的视图和配置,仅修改标签添加逻辑来实现大小写不敏感:
- 创建插件目录与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的预配置视图,保证编辑器配置项和原生一致。
复制内置视图文件
从Umbraco源码中找到内置Tags编辑器的视图(路径:Umbraco.Web.UI.Client/src/views/propertyeditors/tags/tags.html),复制到App_Plugins/TagsCaseInsensitive目录下,无需修改任何内容。编写自定义控制器覆盖添加逻辑
创建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" }); }); } }; }]);
- 替换文档类型中的属性编辑器
进入Umbraco后台,找到使用原生Tags编辑器的属性,将其编辑器切换为我们创建的Tags (Case Insensitive),保存配置即可生效。
方案2:服务器端事件统一处理标签大小写
如果不想修改前端编辑器,可在内容保存时自动标准化标签格式,从根源解决问题:
- 创建内容保存事件处理器
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); } } } } } } }
- 注册事件处理器
在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
相关产品推荐
相关产品推荐

