在现代Web应用中,表单验证是确保用户输入数据有效性的关键步骤。它不仅需要验证字段是否填写,还可能需要根据其他字段的值来设置验证规则。例如,如果用户选择了类型A的产品,那么他们还应该输入产品的数量(必须是整数等)。这些验证规则可能相当复杂,并且可能需要根据条件启用/禁用或显示/隐藏一些控件。
所有这些验证逻辑需要在四个地方实现:
JavaScript代码需要与Java代码保持一致,并且JavaScript用于验证控件的代码虽然相似,但需要重复编写。每当需求变更时,所有地方都需要进行更改。
大多数验证框架只提供基本验证,而不是依赖于其他实体/控件的值/状态。
HTML控件的名称必须与服务器对象中的对应成员名称相同。每个HTML控件都应该有一个有效的"id"。与控件关联的标签应该有一个"for"属性。页面应该包含以下jQuery库:
页面应该在HTML中定义以下CSS类:
<style>
.enabled {
/* CSS样式 */
}
.disabled {
/* CSS样式 */
}
.mandatory {
/* CSS样式 */
}
.nonmandatory {
/* CSS样式 */
}
</style>
成员数据类型应与控件类型相对应:
与操作相关的节点:
条件相关的节点:
示例XML:
<RequiredField name="itemName" regex="^\w+$" message="Item name can only be alpha numeric." />
<RequiredField name="count" />
<RequiredField name="cost" expression="parseInt(val, 10) > 0" message="Cost cannot be zero." />
<RequiredField name="type" enableDisable="true">
<And>
<Condition name="buy" expression="val==true" />
</And>
</RequiredField>
<RequiredField name="woodValue">
<And>
<Condition name="buy" value="true" />
<Condition name="type" value="Wood" />
</And>
</RequiredField>
<ShowHide id="transferDiv">
<And>
<Condition name="transfer" value="true" />
<Not>
<Condition name="userType" value="" />
</Not>
<Condition name="transfer" value="Transfer Date" custom="myCustomFunction" />
</And>
</ShowHide>
条件可以任意复杂。每个RequiredField、ShowHide和EnableDisable几乎可以有一个And子元素,并且只有And作为直接子元素。
要获取客户端JavaScript,请使用:
C# String generatedScript = OperationUtil.getClientScript(obj, validationXML);
对于服务器端验证:
C# InvalidField invalidField = OperationUtil.getInvalidField(obj,validationXML);
如果所有字段都有效,则为null。
C# List<InvalidField> invalidFields = OperationUtil.getInvalidFields(obj,validationXML);
如果所有字段都有效,则大小为0。
validationXML只是XML的名称(或类路径中的相对路径)。假设HTML具有required field和condition节点中给出的所有name的元素。
obj具有required field和condition节点中给出的所有name的相应getters。
如果想在不进行验证的情况下提交表单,可以调用:
C# submitForm(true)
扩展ui.operation.Operation类并实现getClientScript。如果还需要服务器端验证,请实现IValidate接口。getInvalidFields函数将返回实现实例,如果Validate方法返回false。