参数验证的实现思路
被验证的参数分为4种状态:init,uncheck,pass,refuse
状态 | 名称 | 说明 |
init | 初始化状态 | 该状态是刚进入页面时的状态,表示textbox为空,当textbox首次输入内容时,转换为其他状态。如进行参数初始化,则会触发textchanged事件,因此需要对初始状态做一个标识,只需要进行对初始化参数的验证,如通过,则变为pass状态,如未通过,则变为uncheck状态。 |
uncheck | 未受检状态 | 用户输入期间的状态,在用户输入的过程中不对用户输入内容做检查,而是在blur(lostFocus)时对输入进行检查,如通过,变为pass状态,如未通过,变为refuse状态。 |
pass | 通过状态 | 验证通过,可以提交,样式可与init和uncheck相同,也可以不同 |
refuse | 拒绝状态 | 验证未通过,需要修改,一般需要将样式设置为红色,并在合适的位置给出修改提示。除了init状态,当输入为空字符串时,直接进入refuse状态。 |
参数验证状态的主要作用是控制输入框的样式和提示信息的显示,而不对最后的提交内容负责,因为在提交时会重新进行一次检验。
输入过程中的参数校验是为了提示用户进行相应的修改,而在最后提交前,还需要再进行一次检验,可以在此次检验中进行一些耗时操作,如想后端服务器请求参数。
方案 |
| 优点 | 缺点 |
方案一 | 在每次需要后端验证的时候进行验证 | 用户友好 | 对数据库压力大 |
方案二 | 在最后提交时进行验证 | 用户友好度一般 | 数据库压力小 |
方案三 | 使用缓存 | 用户友好,数据库压力小 | 需要注意同步问题 |
// 失去焦点时验证参数格式 private void xLostFocus(object sender, EventArgs e) { if (!RegexUtils.positive_real_number.IsMatch(xTextBox.Text)) { xstatus = InputStatus.refuse; xhintLabel.Text = "请输入大于等于0的实数!"; } else { xstatus = InputStatus.pass; xhintLabel.Text = ""; } }
// 失去焦点时验证参数格式 private void yLostFocus(object sender, EventArgs e) { if (!RegexUtils.positive_real_number.IsMatch(yTextBox.Text)) { ystatus = InputStatus.refuse; yhintLabel.Text = "请输入大于等于0的实数!"; } else { ystatus = InputStatus.pass; yhintLabel.Text = ""; } }
private void xTextBox_TextChanged(object sender, EventArgs e) { // 如果当前状态为被拒绝,则在修改字符后变为uncheck状态 if (xstatus.Equals(InputStatus.refuse) && xTextBox.Text.Length != 0) { xstatus = InputStatus.uncheck; xhintLabel.Text = ""; } else if (xTextBox.Text.Length == 0) { xstatus = InputStatus.refuse; xhintLabel.Text = "请输入大于等于0的实数!"; } }
private void yTextBox_TextChanged(object sender, EventArgs e) { // 如果当前状态为被拒绝,则在修改字符后变为uncheck状态 if (ystatus.Equals(InputStatus.refuse) && yTextBox.Text.Length != 0) { ystatus = InputStatus.uncheck; yhintLabel.Text = ""; } else if (yTextBox.Text.Length == 0) { ystatus = InputStatus.refuse; yhintLabel.Text = "请输入大于等于0的实数!"; } } |