在 C# 中的自定义验证属性中使用异步方法
Use async method in custom validation attribute in c#
我有一个评估字段的异步方法。
Task<bool> MyMethod(object obj);
我想创建一个使用上述方法的自定义验证 属性。
我的问题是 ValidationAttribute
class 不支持异步方法。
我通常重写以下方法:
ValidationResult IsValid (object? obj, ValidationContext validationContext);
但是我的异步方法的输出是Task<ValidationResult>
,我不想使用同步方法。
您有解决方案或建议吗?
提示:由于I/O阻塞,我想使用异步方法。 (没有 CPU 绑定或繁重的操作。)
然后您将不得不选择,如果 ValidationAttribute 不支持 async/await 调用,那么您可能必须进行同步,否则您可以在 IsValid 中调用异步方法,但是那么它就不会阻塞,你可能会得到不正确的结果。
我看不出有任何解决方法,因为您几乎需要立即知道某些内容是有效还是无效。这可能是 ValidationAttribute 无法识别它们的原因。
您可以修改您的模型而不是扩展模型,并拥有一个 isValidChecked 事件或 isInvalid 事件,这些事件因异步的细节更改而触发,然后在这些事件触发时执行某些操作。
Use async method in custom validation attribute
验证管道不是异步的,因此不可能用于此目的。参见 this similar thread。
此外,众所周知,Validation是为了确保类型和值的正确性,而不是评估字段等业务规则。这应该在你的 business/data 层中强制执行,你可以尝试使用 JQuery 验证或 Remote attribute.
我有一个评估字段的异步方法。
Task<bool> MyMethod(object obj);
我想创建一个使用上述方法的自定义验证 属性。
我的问题是 ValidationAttribute
class 不支持异步方法。
我通常重写以下方法:
ValidationResult IsValid (object? obj, ValidationContext validationContext);
但是我的异步方法的输出是Task<ValidationResult>
,我不想使用同步方法。
您有解决方案或建议吗?
提示:由于I/O阻塞,我想使用异步方法。 (没有 CPU 绑定或繁重的操作。)
然后您将不得不选择,如果 ValidationAttribute 不支持 async/await 调用,那么您可能必须进行同步,否则您可以在 IsValid 中调用异步方法,但是那么它就不会阻塞,你可能会得到不正确的结果。
我看不出有任何解决方法,因为您几乎需要立即知道某些内容是有效还是无效。这可能是 ValidationAttribute 无法识别它们的原因。
您可以修改您的模型而不是扩展模型,并拥有一个 isValidChecked 事件或 isInvalid 事件,这些事件因异步的细节更改而触发,然后在这些事件触发时执行某些操作。
Use async method in custom validation attribute
验证管道不是异步的,因此不可能用于此目的。参见 this similar thread。
此外,众所周知,Validation是为了确保类型和值的正确性,而不是评估字段等业务规则。这应该在你的 business/data 层中强制执行,你可以尝试使用 JQuery 验证或 Remote attribute.