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

Optimizely表单网格块特殊属性验证:限制Everyone组选删除权限

需求:为Form Grid Block添加权限验证逻辑

现有代码结构

Form Grid Block属性定义

[Display(Name = "表单访问组", Description = "表单访问组", GroupName = SystemTabNames.Content, Order = 400)]
[EditorDescriptor(EditorDescriptorType = typeof(CollectionEditorDescriptor<FormActionsAccess>))]
public virtual IList<FormActionsAccess> OptimizelyFormActionsAccess { get; set; }

特殊属性类FormActionsAccess定义

public class FormActionsAccess
{
    [Display(Name = "Okta组", Description = "Okta组", Order = 100)]
    [SelectOne(SelectionFactoryType = typeof(OktaGroupSelectionFactory))]
    public virtual string OktaGroup { get; set; }

    [Display(Name = "表单操作权限", Description = "表单操作权限", Order = 200)]
    [SelectMany(SelectionFactoryType = typeof(FormSubmissionDataActionSelectionFactory))]
    [RestrictDeleteOption(nameof(OktaGroup), "Everyone")]
    public virtual string FormOperationAccess { get; set; }
}

核心需求

当OktaGroup选中“Everyone”时,FormOperationAccess禁止选择“delete”操作权限。


实现方案

1. 客户端动态禁用(提升用户体验)

通过自定义EditorDescriptor结合客户端脚本,监听OktaGroup选择变化,动态控制FormOperationAccess的选项可用性:

步骤1:创建自定义EditorDescriptor

[EditorDescriptorRegistration(TargetType = typeof(IList<FormActionsAccess>))]
public class CustomFormActionsAccessEditorDescriptor : CollectionEditorDescriptor<FormActionsAccess>
{
    public override void ModifyMetadata(ExtendedMetadata metadata, IEnumerable<Attribute> attributes)
    {
        base.ModifyMetadata(metadata, attributes);
        metadata.ClientEditingClass = "custom/FormActionsAccessEditor";
    }
}

步骤2:编写客户端脚本(custom/FormActionsAccessEditor.js)

define([
    "dojo/_base/declare",
    "epi-cms/contentediting/editors/CollectionEditor"
], function (declare, CollectionEditor) {
    return declare([CollectionEditor], {
        _createItemEditor: function (item, index) {
            var editor = this.inherited(arguments);
            
            // 获取对应控件
            var oktaGroupSelect = editor.containerNode.querySelector('[data-property-name="OktaGroup"] select');
            var operationSelect = editor.containerNode.querySelector('[data-property-name="FormOperationAccess"] select');
            
            // 定义权限控制逻辑
            var toggleDeleteOption = function() {
                var isEveryoneSelected = oktaGroupSelect.value === "Everyone";
                var deleteOption = operationSelect.querySelector('option[value="delete"]');
                if (deleteOption) {
                    deleteOption.disabled = isEveryoneSelected;
                    // 若已选中delete且当前为Everyone,自动取消选中
                    if (isEveryoneSelected && deleteOption.selected) {
                        deleteOption.selected = false;
                        operationSelect.dispatchEvent(new Event('change'));
                    }
                }
            };
            
            // 初始化执行+监听变化
            toggleDeleteOption();
            oktaGroupSelect.addEventListener('change', toggleDeleteOption);
            
            return editor;
        }
    });
});

2. 服务端验证(确保数据合法性)

添加自定义验证属性,在保存时强制校验,防止绕过客户端验证的非法数据:

步骤1:创建自定义验证属性

public class RestrictDeleteForEveryoneAttribute : ValidationAttribute
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        var formActionsAccess = validationContext.ObjectInstance as FormActionsAccess;
        if (formActionsAccess == null) return ValidationResult.Success;
        
        if (formActionsAccess.OktaGroup == "Everyone" && !string.IsNullOrEmpty(formActionsAccess.FormOperationAccess))
        {
            var selectedOperations = formActionsAccess.FormOperationAccess.Split(',', StringSplitOptions.RemoveEmptyEntries);
            if (selectedOperations.Contains("delete", StringComparer.OrdinalIgnoreCase))
            {
                return new ValidationResult("当选择\"Everyone\"组时,不可授予\"delete\"操作权限");
            }
        }
        
        return ValidationResult.Success;
    }
}

步骤2:绑定验证属性到类

[RestrictDeleteForEveryone]
public class FormActionsAccess
{
    // 原有属性定义保持不变
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 17:52:44