• 「详解」看界面控件DevExtreme如何实现异步验证


    DevExtreme拥有高性能的HTML5 / JavaScript小部件集合,使您可以利用现代Web开发堆栈(包括React,Angular,ASP.NET Core,jQuery,Knockout等)构建交互式的Web应用程序,该套件附带功能齐全的数据网格、交互式图表小部件、数据编辑器等。

    DevExtreme v22.1正式版下载

    现在可以使用异步验证规则在服务器上执行字段验证逻辑,实现函数validationCallback来返回一个Promise(或者jQuery的等效函数)。

    下面是一个示例:

    1. $('#textBox').dxTextBox({ ... })
    2. .dxValidator({
    3. validationRules: [{
    4. type: 'async',
    5. message: 'Invalid value',
    6. validationCallback: ({value}) =>
    7. new Promise((resolve, reject) => {
    8. fetch('https://mydomain.com/validationService', {
    9. method: 'POST',
    10. body: JSON.stringify({ data: value })
    11. })
    12. .then(res => {
    13. if (!res.ok)
    14. throw new Error(`HTTP error: ${res.status} ${res.statusText}`);
    15. // Assuming the server returns JSON
    16. return res.json();
    17. })
    18. .then(serverResult => {
    19. // Server decided whether data is valid
    20. if (serverResult.dataIsValid)
    21. resolve();
    22. else
    23. reject(serverResult.errorMessage);
    24. })
    25. .catch(error => {
    26. // There's been a technical error.
    27. console.error('Server-side validation error', error);
    28. // Decide what to tell the user.
    29. reject('Cannot contact validation server');
    30. });
    31. });
    32. }
    33. }]
    34. });

    如果Promise被解析,验证就成功,如果Promise被拒绝,验证就失败。然而还有一个选择,您可以用一个像这样的对象来解析Promise:

    1. {
    2. isValid: false,
    3. message: 'Invalid value'
    4. }

    DevExtreme目前支持这种场景,允许您直接返回服务器结果,不需要任何额外的逻辑。在这种情况下,即使Promise被解析,验证的成功或失败取决于isValid属性,失败时将向用户显示可选消息。为了说明这个用例,下面是一个短的示例:

    1. validationCallback(params) {
    2. return $.getJSON('https://mydomain.com/validationService',
    3. { data: params.value });
    4. }

    注意,如果不进行任何处理,您可能会将技术错误作为验证消息显示给最终用户,推荐考虑边界情况的更详细的算法,如第一个示例所示。

    为了保持有效的验证,总是首先评估任何同步规则,只有在所有同步规则都通过时才评估异步规则。一旦异步验证开始,所有这些规则都将被并行检查。

    ASP.NET Core & ASP.NET MVC

    我们增加了对ASP.NET [Remote]属性在ASP.NET Core和ASP.NET MVC上启用异步验证,您可以将此属性应用到模型的属性中,传递控制器的名称和要调用的方法进行验证。

    1. [Remote("CheckEmailAddress", "Validation")]
    2. public string Email { get; set; }

    该属性自动为' async '验证规则生成客户端代码,回调服务器上运行的控制器,控制器方法应该检查有效性:

    1. [HttpPost]
    2. public IActionResult CheckEmailAddress(string email) {
    3. if (!_userRepository.VerifyEmail(email)) {
    4. return Json($"Email {email} is already registered.");
    5. }
    6. return Json(true);
    7. }

    这段代码使用Microsoft文档中为.NET Core Remote属性定义的返回值。

    或者,您也可以以上面描述的JSON格式返回有效性信息,包括isValid和message字段,这允许您在.NET Core中创建验证服务,这些服务与为其他受支持的DevExtreme平台编写的客户端兼容。

    显式验证

    如果在ValidatorValidationGroup 上调用validate(),并且有要检查的异步规则,则需要使用ValidationResult.complete 属性提供的Promise接口来处理结果。

    1. const result = validator.validate(); // OR validationGroup.validate();
    2. result.complete.then(res => {
    3. // res.status is 'valid' if all rules passed
    4. // res.status is 'invalid' if any rules failed
    5. if (res.status === 'invalid') {
    6. // res.brokenRules contains an array of rules
    7. // that failed validation
    8. }
    9. });

    限制

    此时当您使用行、批处理或单元格编辑模式时,数据网格和树列表小部件不支持异步规则。

     

  • 相关阅读:
    前端模块化
    springsecurity+vue实现登陆认证
    【Unity实战100例】从Unity对象池里获取各种月饼
    burp改返回包(Burp Suite抓包使用步骤)
    Qt的模型与视图
    【关系推导】Codeforces Round #813 (Div. 2) E1. LCM Sum (easy version)
    将windows命令行的结果保存到文件 (cmd命令的重定向输出)
    【C语言指针】用指针提升数组的运算效率
    GO实现Redis:GO实现Redis的AOF持久化(4)
    并发基本原理(四):AQS源码解析1-ReentrantLock的lock实现原理
  • 原文地址:https://blog.csdn.net/AABBbaby/article/details/127401591