这是一个无耻的插件,但我可以自愿提供我设计的framework 吗?我已经基于注释(一个 la Hibernate Validator)构建了它。它支持自定义约束,我觉得它非常强大。 Here 也是一个 Stackoverflow 问题,我要求对框架进行审查。
-
演示文稿:使用自定义验证约束,您可以将验证绑定到 onChange 元素。此外,由于 Regula 支持自定义验证器,您可以让自定义验证器更新字段的值(因此将
5 更改为 5.00)。
-
副作用:Regula 通过自定义约束验证器支持副作用。
-
组:Regula 支持验证组。您可以针对特定组进行验证。通过组合自定义验证器和组,您可以控制验证器的行为,以便它仅在该组的所有元素都被填充时验证 (尽管您必须通过普通 Javascript 执行此检查) .
-
服务器端验证:使用自定义约束,您可以进行 AJAX 调用来执行服务器端验证。以目前框架的结构方式,这必然是一个阻塞的 ajax 调用。我计划在未来添加异步功能。
-
每页多个表单:Regula 不限于每页验证一个表单。它可以处理多种形式(不确定我是否正确理解了您的要求 - 所以我可能没有正确回答这部分)。
-
可自定义的错误显示:就验证而言,Regula 不会对页面的 UI 做任何事情。当您验证时,您会得到一组包含错误消息等的约束违规。如何显示它们取决于您。
-
Snappiness:我没有执行任何基准测试,因此我无法评论我的框架在这方面的表现。
-
提交按钮:这是我尚未解决的问题(异步与同步)。
这里有几个例子:
以下显示了标准验证,带有内置约束:
<input id = "myInput"
name = "myInput"
type = "text"
class = "regula-validation"
data-constraints = '@NotEmpty @IsNumeric @Between(min=1, max=5)' />
jQuery(document).ready(function() {
// must call regula.binnd() first. The best place would be in an
// onload handler. This function looks for elements with
// a class name of "regula-validation" and binds the
// appropriate constraints to the elements
regula.bind();
jQuery("#myForm").submit(function() {
// this function performs the actual validation
var validationResults = regula.validate();
for(var index in validationResults) {
var validationResult = validationResults[index];
alert(validationResult.message);
}
});
});
如您所见,您只处理违反约束的情况,因此显示错误消息的方式完全取决于您。
这是一个自定义约束的示例:
regula.custom({
name: "MustBe42",
defaultMessage: "The answer must be equal to 42",
validator: function() {
return this.value == 42;
}
});
及其用途:
<input id = "theAnswerToLifeTheUniverseAndEverything"
name = "theAnswerToLifeTheUniverseAndEverything"
value = ""
class = "regula-validation"
data-constraints = "@MustBe42" />
由于验证器是一个 Javascript 函数,你可以让它做任何事情(所以这解决了你关于副作用的问题)。
这是另一个接受参数的约束的示例:
regula.custom({
name: "DivisibleBy",
defaultMessage: "{label} must be divisible by {divisor}",
params: ["divisor"],
validator: function(params) {
var divisor = params["divisor"];
return (this.value % divisor) == 0;
}
});
及用法:
<input id = "number"
name = "number"
value = ""
class = "regula-validation"
data-constraints = "@DivisibleBy(divisor=3, label='The Number')" />
以下是使用验证组的示例:
<input id = "score"
name = "score"
type = "text"
class = "regula-validation"
data-constraints = '@IsNumeric(label="Score",
message="{label} needs to be a number!"
groups=[FirstGroup, SecondGroup, ThirdGroup]' />
<input id = "age"
name = "age"
type = "text"
class = "regula-validation"
data-constraints = '@IsNumeric(label="Age",
message="{label} needs to be a number!"
groups=[SecondGroup]' />
<input id = "name"
name = "name"
type = "text"
class = "regula-validation"
data-constraints = '@NotEmpty(label="Name",
message="{label} cannot be empty!"
groups=[FirstGroup]' />
还有一个仅验证 FirstGroup 的 sn-p(因此仅验证 score 和 name):
var constraintViolations = regula.validate({groups: [regula.Group.FirstGroup]});
var messages = "";
for(var index in constraintViolations) {
var constraintViolation = constraintViolations[index];
messages += constraintViolation.message + "\n";
}
if(messages != "") {
alert(messages);
}
如果您打算尝试一下,我建议您下载版本 1.1.1。当前文档专门匹配该版本。在 1.2.1 中,我添加了对复合约束的支持,但我没有更新我的文档以反映这一点。
我了解这是否不能解决您的所有问题,或者这不是您想要的。我以为我会把它放在那里。此外,如果您确实检查了它,那么我将确保更新文档以反映版本 1.2.1。我一直忙于学习和工作,所以我没有时间这样做。
更新 #1
Sohnee 提到了客户端验证。我实际上正在研究 Regula 和 Spring 3 之间的集成。希望我能够很快发布它(再次取决于工作和学校)。该集成通过将 Hibernate 验证约束转换为 Regula 验证约束来工作。这样,您只需(大部分)编写一次验证代码。但是,对于自定义约束,您仍然必须在 Javascript 端(自定义验证器)编写代码。但是一旦你用 Hibernate 验证约束在服务器端注释代码,你就不需要在客户端做任何事情了。这些约束会自动应用于客户端的表单元素。
Matthew Abbott 也可以integrate Regula with ASP.NET MVC。
更新 #2
我有一个演示 webapp(mavenized)on github,它展示了 Regula 和 Spring 3.0.x Web MVC 之间使用 Hibernate Validator 的集成。它没有真正的记录或任何东西,它更多的是概念验证。我计划在 github 页面上添加一些关于集成及其工作原理的文档。
更新 #3
我已经更新了wiki 上的文档,现在它对应于最新版本,1.2.2(我做了一些小错误修复,这就是为什么它是 1.2 .2 现在)。