MVVM架构~knockoutjs系列之扩展ajax验证~验证输入数据是否与后台数据相等

简介:

在看这篇文章之前,你有必要先看我之前的文章,之前文章是将一个方法以参数的形式传给KO,然后返回一个真假值,去做验证,这类似于面向对象语言里的委托,在JS里我们叫它回调方法,本篇文章与前一文章不同,需要有两个参数,其一是远程方法的签名(JS方法),其二是已知要比较的数据(可能是加密后的密码数据),当用户输入文字后,它将会调用JS方法获取远程数据,以比较原数据与你输入的数据是否匹配.

知识点:以对象作为参数进行传递

ko.validation.js的扩展

   //ajax相等验证
    kv.rules['ajaxDataEqual'] = {
        validator: function (val,params) {
            var result = true;//默认为验证通过
            $.when(params.ajaxMethod(val)).then(function (data) {
                result = kv.utils.isEmptyVal(val) || data == kv.utils.getValue(params.otherValue); //val为空走reqired逻辑,不为空再走ajax逻辑
            });
            return result;
        },
        message: 'Two value must equal.'
    };

HTML代码

<form id="form1" style="width: 800px;">
    <div class="editor-label">
        提现金额:
    </div>
    <div class="editor-field" style="width: 700px">
        <input name="Money" data-bind='value: Money' />
        <span class="validationError" data-bind="validationMessage:Money"></span>
    </div>
    <div class="editor-label">
        支付密码:
    </div>
    <div class="editor-field" style="width: 700px">
        <input name="Paypassword" data-bind='value: Paypassword' />
        <span class="validationError" data-bind="validationMessage:Paypassword"></span>
    </div>
    <p>
        <input type="button" data-bind="click:cash" value="提现" />
    </p>
</form>

相关JS调用时的代码

<script type="text/ecmascript">
        function getpassword(key) {
            return $.ajax({
                url: "/ef/GetPayPassword",
                data: { key: key },
                type: "get",
                dataType: "json",
                async: false,
                success: function (data) {
                    return data;
                }
            });
        }
        var userWithdraw = function () {

            var self = this;
            ko.validation.configure({//ko.validation相关配置
                insertMessages: false
            });

            self.Money = ko.observable().extend({
                min: { params: 1, message: "金额最小为1..." },
                max: { params: 1000, message: "金额最大为1000..." },
                required: {
                    params: true,
                    message: "请输入提现金额..."
                }
            });

            self.Paypassword = ko.observable().extend({

                ajaxDataEqual: { params: { ajaxMethod: getpassword, otherValue: "zzl123" }, message: "支付密码不正确..." },//注意,这只是个实例,说明ajaxDataEqual的用法,实现中,密码不应该保留到前端
                required: {
                    params: true,
                    message: "请输入支付密码..."
                }
            });

            self.cash = function () {
                self.errors = ko.validation.group(self);
                if (self.isValid()) {
                    alert("可以进行提现")
                } else {

                    self.errors.showAllMessages();
                }
            }
        }
        ko.applyBindings(new userWithdraw());
    </script>

最后程序运行的结果

本实例可以帮助我们完成类似支付,提现等功能模块的验证工作.

对于上面的业务大家可能会有些疑惑,怎么把密码暴露到前端了,当然这只是个实例,在项目中,我们应该使用ajaxData进行真假值的验证,密码的验证应该放到后端的方法里,下面是项目中的代码

   self.Paypassword = ko.observable().extend({
                ajaxData: { params: confirmPassword, message: "支付密码不正确..." },
                required: {
                    params: true,
                    message: "请输入支付密码..."
                }
            });
   function confirmPassword(key) {
            return $.ajax({
                url: "/ef/ConfirmPassword",
                data: { key: key },
                type: "get",
                dataType: "json",
                async: false,
                success: function (data) {
                    return data;
                }
            });
        }

下面是C#后端代码,完成了密码的验证

  /// <summary>
        /// 得到用户的支付密码
        /// 只返回真假值,不返回加密后的密码
        /// </summary>
        /// <param name="userid"></param>
        /// <returns></returns>
        public JsonResult ConfirmPassword(string key)
        {
            string oldPassword = "zzl123";//! 这个密码一般是通过当前登陆ID从数据库里查询出来的,不会暴露在前端
            if (key == oldPassword)
                return Json(true, JsonRequestBehavior.AllowGet);
            else
                return Json(false, JsonRequestBehavior.AllowGet);
        }

 本文转自博客园张占岭(仓储大叔)的博客,原文链接:MVVM架构~knockoutjs系列之扩展ajax验证~验证输入数据是否与后台数据相等,如需转载请自行联系原博主。

相关文章
|
1月前
|
微信读书十周年,后台架构的技术演进和实践总结
微信读书经过了多年的发展,赢得了良好的用户口碑,后台系统的服务质量直接影响着用户的体验。团队多年来始终保持着“小而美”的基因,快速试错与迭代成为常态。后台团队在日常业务开发的同时,需要主动寻求更多架构上的突破,提升后台服务的可用性、扩展性,以不断适应业务与团队的变化。
61 0
Kotlin教程笔记 - MVP与MVVM架构设计的对比
Kotlin教程笔记 - MVP与MVVM架构设计的对比
265 4
Kotlin教程笔记 - MVVM架构怎样避免内存泄漏
Kotlin教程笔记 - MVVM架构怎样避免内存泄漏
98 2
JeecgBoot 低代码平台 v3.7.4 发布,后台架构大升级
JeecgBoot 是一款基于 SpringBoot2.x/3.x 和 SpringCloud Alibaba 的企业级 AI 低代码平台,采用前后端分离架构(Ant Design & Vue3),支持 Mybatis-plus 和 Shiro。它集成了强大的代码生成器,可一键生成前后端代码,无需手动编写,大幅减少重复工作。平台支持 DeepSeek、ChatGPT 和 Ollama 等主流大模型,提供 AI 对话
256 9
后端服务架构的微服务化转型
本文旨在探讨后端服务从单体架构向微服务架构转型的过程,分析微服务架构的优势和面临的挑战。文章首先介绍单体架构的局限性,然后详细阐述微服务架构的核心概念及其在现代软件开发中的应用。通过对比两种架构,指出微服务化转型的必要性和实施策略。最后,讨论了微服务架构实施过程中可能遇到的问题及解决方案。
云计算的未来:云原生架构与微服务的革命####
【10月更文挑战第21天】 随着企业数字化转型的加速,云原生技术正迅速成为IT行业的新宠。本文深入探讨了云原生架构的核心理念、关键技术如容器化和微服务的优势,以及如何通过这些技术实现高效、灵活且可扩展的现代应用开发。我们将揭示云原生如何重塑软件开发流程,提升业务敏捷性,并探索其对企业IT架构的深远影响。 ####
190 3
云原生架构下的微服务治理与挑战####
随着云计算技术的飞速发展,云原生架构以其高效、灵活、可扩展的特性成为现代企业IT架构的首选。本文聚焦于云原生环境下的微服务治理问题,探讨其在促进业务敏捷性的同时所面临的挑战及应对策略。通过分析微服务拆分、服务间通信、故障隔离与恢复等关键环节,本文旨在为读者提供一个关于如何在云原生环境中有效实施微服务治理的全面视角,助力企业在数字化转型的道路上稳健前行。 ####
云原生时代的应用架构演进:从微服务到 Serverless 的阿里云实践
云原生技术正重塑企业数字化转型路径。阿里云作为亚太领先云服务商,提供完整云原生产品矩阵:容器服务ACK优化启动速度与镜像分发效率;MSE微服务引擎保障高可用性;ASM服务网格降低资源消耗;函数计算FC突破冷启动瓶颈;SAE重新定义PaaS边界;PolarDB数据库实现存储计算分离;DataWorks简化数据湖构建;Flink实时计算助力风控系统。这些技术已在多行业落地,推动效率提升与商业模式创新,助力企业在数字化浪潮中占据先机。
249 12
从单体到微服务:如何借助 Spring Cloud 实现架构转型
**Spring Cloud** 是一套基于 Spring 框架的**微服务架构解决方案**,它提供了一系列的工具和组件,帮助开发者快速构建分布式系统,尤其是微服务架构。
536 70
从单体到微服务:如何借助 Spring Cloud 实现架构转型
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问