三 基于模型状态进行客户端校验
常规的校验方法通常是在客户端使用Javascript脚本语言来执行数据输入的验证。有时候,我们还可能需要使用JavaScript在客户端进行业务规则的验证。仅当客户端验证不可靠时,才使用服务器端验证。显然,服务器端验证是被安排在类似C#这样的服务器端语言代码实现中。这种方法存在一个明显的问题是,在一段时间内,我们很有可能需要重复地使用数据以及业务规则验证逻辑等。
为了解决上面这样的问题,我们可以在模型中加入方法,交由它来维护和强制执行所有的验证工作。这样一来,当需要改变验证逻辑时,仅需要在模型部分执行相应的改变逻辑,但却能够自动影响到系统中所有相关内容。
ASP.NET MVC框架提供给我们许多种方案来执行校验逻辑任务,而这些工作仅需要使用我们所熟悉的C#编码即可。这样一来,校验规则被交由HTTP请求管道进行处理,从而使我们可以在客户端向用户提供校验相关的提示信息。
ASP.NET MVC中使用一个临时存储区,命名为“ModelState”,用于存储所有的绑定操作模式期间发生的验证错误。调用方法ModelState.IsValid可以确定模型绑定操作是否发生了任何验证错误。如果有任何错误,则此方法将返回false。另外,ASP.NET MVC框架也提供了相应的机制用于向终端用户展示ModelState中存储的错误信息。为使模型部分(即C#类)使用此功能,模型应该实现IDataErrorInfo接口。
在我们的示例应用程序中,模型“Employee”需要实现如下的接口:
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel;
namespace WizardTypeUITwo.Models
{
[Serializable]
public class Employee : IDataErrorInfo
{
//个人信息
public string Name { get; set; }
public int? Age { get; set; }
//职业信息
public string CurrentEmplrName { get; set; }
public int? Salary { get; set; }
//联系信息
public string Email { get; set; }
public int? Mobile { get; set; }
public string this[string columnName]
{
get
{
if ((columnName == "Name") && string.IsNullOrEmpty(Name))
return "Please enter a name";
if ((columnName == "Age") && !Age.HasValue)
return "Please enter a numeric age";
if ((columnName == "CurrentEmplrName") && string.IsNullOrEmpty(
CurrentEmplrName))
return "Please enter current employer name";
if ((columnName == "Salary") && !Salary.HasValue)
return "Please enter salary";
if ((columnName == "Email") && !IsValidEmailAddress(Email))
return "Please enter a valid email address";
if ((columnName == "Mobile") && !Mobile.HasValue)
return "Please enter mobile number";
return null;
}
}
private static bool IsValidEmailAddress(string email)
{
//请根据您的具体情况进一步改进这里的逻辑
return (email != null) && (email.IndexOf("@") > 0);
}
//遵循默认编译规则
public string Error { get { return null; } }
}
}
在本文雇员注册示例程序中,页面Step1.aspx对应于第一个视图。借助于HTML辅助方法,我们会及时地通知用户相应的验证错误信息。
<label for="Name">Name:</label>
<%= Html.TextBox("Name", Model.Name) %>
<%= Html.ValidationMessage("Name", "*") %>
通过在服务器端执行任何操作之前调用ModelState.IsValid方法,我们可以限制用户进入到系统注册流程中的下一个界面。在本文示例应用程序中,只有在填充适当的信息之后,才允许用户进入到下一个步(页面Step2.aspx)。