表单验证的实现

在现代Web应用中,表单验证是确保用户输入数据有效性的关键步骤。它不仅需要验证字段是否填写,还可能需要根据其他字段的值来设置验证规则。例如,如果用户选择了类型A的产品,那么他们还应该输入产品的数量(必须是整数等)。这些验证规则可能相当复杂,并且可能需要根据条件启用/禁用或显示/隐藏一些控件。

所有这些验证逻辑需要在四个地方实现:

  • 页面加载后(控件应该以特定状态呈现)。
  • 用户更改页面时。
  • 服务器端的UI层。
  • 在业务逻辑层(BL层)。

JavaScript代码需要与Java代码保持一致,并且JavaScript用于验证控件的代码虽然相似,但需要重复编写。每当需求变更时,所有地方都需要进行更改。

大多数验证框架只提供基本验证,而不是依赖于其他实体/控件的值/状态。

先决条件

HTML控件的名称必须与服务器对象中的对应成员名称相同。每个HTML控件都应该有一个有效的"id"。与控件关联的标签应该有一个"for"属性。页面应该包含以下jQuery库:

  • jquery-1.7.1.min.js
  • jquery-ui-1.7.2.min.js(如果使用日期)
  • jquery-ui-timepicker-addon.js(如果使用日期)

页面应该在HTML中定义以下CSS类:

<style> .enabled { /* CSS样式 */ } .disabled { /* CSS样式 */ } .mandatory { /* CSS样式 */ } .nonmandatory { /* CSS样式 */ } </style>

成员数据类型应与控件类型相对应:

  • 复选框 - 布尔值
  • 多选 - 列表(支持所有字符串、长整型、浮点数和整数泛型类型)
  • 单选 - 字符串
  • 文本框 - 字符串、整数、int、长整型、long、浮点数和日期(框架自动添加日历控件)

验证XML格式

与操作相关的节点:

  • RequiredField - 验证字段非空,可选地满足特定格式,仅在给定条件满足时。如果没有给出条件,则必须有值。对于多选列表,至少需要选择一个值。
  • ShowHide - 根据条件隐藏控件(及其标签)。
  • EnableDisable - 根据条件禁用(及其标签)。

条件相关的节点:

  • And - 逻辑与运算符。
  • Or - 逻辑或运算符。
  • Not - 逻辑非运算符。
  • Condition - 需要满足的条件。

示例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。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485