返回目录

在看这篇文章之前,你有必要先看我之前的文章,之前文章是将一个方法以参数的形式传给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. MVVM架构~knockoutjs系列之扩展ajax验证~验证数据是否存在

    返回目录 在大部分网站里,用户名都是唯一的,即当用户注册时,如果用户输入的名字不合法,我们需要提示用户,让用户再起个新名字,而这种复杂的验证一般是通过JS来实现的,如果把它集成到ko里,那就完美了.有 ...

  2. MVVM架构~knockoutjs系列之为Ajax传递Ko数组对象

    返回目录 一些要说的 这是一个很有意思的题目,在KO里,有对象和数组对象两种,但这两种对象对外表现都是一个function,如果希望得到他的值,需要进行函数式调用,如ko_a(),它的结果为一个具体值 ...

  3. MVVM架构~knockoutjs系列之表单添加(验证)与列表操作源码开放

    返回目录 本文章应该是knockoutjs系列的最后一篇了,前几篇中主要讲一些基础知识,这一讲主要是一个实际的例子,对于一个对象的添加与编辑功能的实现,并将项目源代码公开了,共大家一起学习! knoc ...

  4. MVVM架构~Knockoutjs系列之验证机制的引入

    返回目录 对于Knockoutjs本身来说,没有提供验证模块,不过,有第三方的扩展,就像你为jquery库作extensions一样,这讲中我将介绍一个Knockout插件扩展,knockout.va ...

  5. MVVM架构~knockoutjs系列之级联select

    返回目录 对于下拉列表框的绑定在之前的knockoutjs文章中已经介绍过,今天主要说一下级联的select,事实上,在knockoutjs里,是以数据绑定为中心的,而数据是以面向对象为前提的,而对于 ...

  6. MVVM架构~knockoutjs系列之验证信息自定义输出~再续

    返回目录 对于一个项目的表单验证,方式有很多,效果也有很多,具体使用哪种完成取决于产品这边,产品让你用什么,你就要用什么,而做为开发人员,我们要做的就是"整理近可能多的架构方式",这样才可以自由的应变 ...

  7. MVVM架构~knockoutjs系列之为validation.js扩展minLength和maxLength

    返回目录 为什么要对minLength和maxLength这两个方法进行扩展呢,是因为这样一个需求,在用户注册时,可以由用户自己决定他们输入的字符,中文,英文,数字均可,这样做了之后,使用户的体验更好 ...

  8. MVVM架构~knockoutjs系列之验证信息自定义输出

    返回目录 这个文章非常重要,也是非常必要的,在我们进行项目开发时,后台无所谓,对样式无要求,而网站前台来说,对样式要求严格,你的验证信息都是前台设计好的,所以,不能使用knockoutjs自带的了,我 ...

  9. MVVM架构~knockoutjs系列之验证信息自定义输出~续

    返回目录 上一讲中,我以一个实际中的例子说明了knockoutjs的自定义验证功能,在使用过程中,出现了一个问题,当然了不是问题,只是一种需求,上一讲中自定义验证的表现是:当页面加载后,自动显示有问题 ...

随机推荐

  1. AD帐户操作C#示例代码(一)——导入用户信息

    最近写了一个AD帐户导入的小工具(为啥写作“帐”户呢?),跟大家分享下相关代码,欢迎各位高手指教! 首先,我准备一个这样的Excel文件作为导入模版,并添加了一些测试数据. 然后,我打开Visual ...

  2. javascript code snippet -- Forwarding Mouse Events Through Layers

    Anyone who has worked with web apps has likely created a masking element at some point, and the grea ...

  3. Spring MVC 流程图(转)

    Spring MVC工作流程图   图一   图二    Spring工作流程描述       1. 用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServle ...

  4. First Missing Positive && missing number

    https://leetcode.com/problems/first-missing-positive/ 我原以为数组中不会有重复的数字,所以利用min.max分别记录给定数组中出现的最小正整数和最 ...

  5. Merge在Sqlserver使用例子说明

    ---文章 MatchInt的方式 Create table SourceTable([ID] int,[Desc] varchar(50)); Create table TargetTable([I ...

  6. 【解题报告】BZOJ2550: [Ctsc2004]公式编辑器

    题意:给定一个可视化计算器的操作序列,包括插入数字.字母.运算符.分数.矩阵以及移动光标.矩阵插入行.插入列,输出操作序列结束后的屏显(数学输出). 解法:这题既可以用来提升OI/ACM写大代码模拟题 ...

  7. c#后台进行窗体切换的方法

    Response.Redirect("http://localhost:60896/WebForm2.aspx");

  8. 将图片压缩后转Base64函数

    function CutImgToBase(fn: string): string; // 压缩图片只能压缩bmp:将jpg转换成bmp再压缩 var m1: TMemoryStream; m2: T ...

  9. python 库安装

    用到再更新. #Windows 一 exe 安装包 http://www.lfd.uci.edu/~gohlke/pythonlibs/#scikit-learn 二 setup.py cmd 进入目 ...

  10. Java日期格式化及其使用例子收集

    1 SimpleDateFormat担当重任,怎样格式化都行 import java.util.Date; import java.text.SimpleDateFormat; public clas ...