【问题标题】:Use async method in custom validation attribute in c#在 C# 的自定义验证属性中使用异步方法
【发布时间】:2020-08-27 04:45:49
【问题描述】:

我有一个评估字段的异步方法

Task<bool> MyMethod(object obj);

我想创建一个使用上述方法的自定义验证属性。 我的问题是ValidationAttribute 类不支持异步方法。

我通常会覆盖以下方法:

ValidationResult IsValid (object? obj, ValidationContext validationContext);

但是我的异步方法的输出是Task&lt;ValidationResult&gt;,我不想使用同步方法。

您有解决方案或建议吗?

提示:由于 I/O 阻塞,我想使用异步方法。 (没有 CPU 限制或繁重的操作。)

【问题讨论】:

  • MyMethod 中一定有一些非常繁重的验证。
  • @Enigmativity 不,问题是 I/O 阻塞。
  • 是的,I/O 将是繁重的验证。

标签: c# asp.net asp.net-core asynchronous custom-attributes


【解决方案1】:

在自定义验证属性中使用异步方法

验证管道不是异步的,因此不可能用于此目的。见this similar thread

此外,众所周知,验证是关于确保类型和值的正确性,而不是评估字段等业务规则。这应该在您的业务/数据层中强制执行,您可以尝试使用 JQuery 验证或Remote attribute

【讨论】:

    【解决方案2】:

    您将不得不选择,如果 ValidationAttribute 不支持异步/等待调用,那么您可能必须进行同步,否则您可以在 IsValid 中调用异步方法,但它不会t 阻止,您可能会得到不正确的结果。

    我看不出有任何解决办法,因为您几乎需要立即知道某事是有效还是无效。这可能是 ValidationAttribute 无法识别它们的原因。

    你可以修改你的模型而不是扩展你的模型,并且有一个 isValidChecked 事件或 isInvalid 事件,它会从异步的细节更改中触发,然后在这些事件触发时执行一些操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-15
      • 2019-03-02
      • 1970-01-01
      • 2018-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多