Skip to content

高级自定义校验

属性校验章节中,我们可以通过标注一些Attribute实现简单的设计时校验逻辑。但是,有时校验逻辑会相对复杂,如几个属性间相互作用下的校验逻辑。相对复杂的校验逻辑要如何实现呢?

例如,有一个命令,有两个数字类型的属性,代码如下。

csharp
    [Designer("MyPlugin.Designer.MyPluginCommandDesigner, MyPlugin")]
    public class MyPluginCommand : Command
    {
        public int MyProperty { get; set; }
        public int MyProperty1 { get; set; }
    }

编辑命令时校验

如果校验逻辑要求,MyProperty 与 MyProperty1 的和,必须大于100。可以重写 CommandDesigner 的 Validate 方法, 这个方法如果返回一个不为Null的字符串,表示校验失败,并且会在命令对话框中弹出错误提示

csharp
    public class MyPluginCommandDesigner : CommandDesigner<MyPluginCommand>
    {
        public override string Validate()
        {
            if (this.Command.MyProperty + this.Command.MyProperty1 < 100)
            {
                return "MyProperty 与 MyProperty1 的和必须大于 100";
            }
            return base.Validate();
        }
    }

设计器效果

1703493204211-3b199c0c-4fc6-41ff-9125-9b8049a091b3.png

生成工程时校验时校验

如果校验逻辑要求,MyProperty 与 MyProperty1 的和,必须大于100,如果小于100,应该给用户提出警告,如果小于10 ,则应该提出错误。这是一个相对复杂的校验逻辑,没有办法通过标注 Attribute 实现,只能通过代码逻辑来实现。实现的方式是让 CommandDesigner 实现 ICommandChecker接口。代码如下

csharp
    public class MyPluginCommandDesigner : CommandDesigner<MyPluginCommand>, ICommandChecker
    {
        public IEnumerable<ForguncyErrorInfo> CheckCommandErrors(IBuilderCommandContext context)
        {
            if (this.Command.MyProperty + this.Command.MyProperty1 <= 10)
            {
                yield return new ForguncyErrorInfo()
                {
                    ErrorType = ForguncyErrorType.Error,
                    Message = "MyProperty 与 MyProperty1 的和不能小于等于 10"
                };
            }
            else if(this.Command.MyProperty + this.Command.MyProperty1 < 100)
            {
                yield return new ForguncyErrorInfo()
                {
                    ErrorType = ForguncyErrorType.Warning,
                    Message = "MyProperty 与 MyProperty1 的和小于 100 的设置是不合理的,请考虑修改"
                };
            }
        }
    }

效果:

当命令的设置为两个属性值的和大于等于 100 时,活字格不会报错

当命令的设置为两个属性值的和在10 到 99之间时,活字格在运行时会产生一个警告。
1703044766500-a72d4339-4f45-479c-9d83-6fbe26b9246b.png

当命令的设置为两个属性值的和小于 10 时,活字格在运行时会产生一个错误,并且不会运行应用程序。

1703044833164-908712b8-fb58-4ec5-9eb7-9ba3b646a6a5.png

WARNING

注意,校验逻辑会在每次活字格生成工程时都会被触发。开发者应该尽量保证校验逻辑高效进行,避免IO,网络访问,大量循环等慢操作,导致活字格生成效率降低

更新: 2023-12-25 16:39:10
原文: https://www.yuque.com/robert-bh51n/ea8l6c/tlg6dg025wgm9ndl