注意,当你把一个CustomValidator添加到一个类上时,你需要指定一个对象的类型。例如,在列表3中,CustomValidator就指向一个ProductValidator类。这个类中包含了实现定制校验的相关逻辑。列表4提供了该ProductValidator类的实现代码。
列表4–Validators\ProductValidator.cs
using System;
using System.Web.Mvc;
using Microsoft.Web.Mvc;
using MvcValidation;
namespace MvcValidationWebsite.Validators
{
public class ProductValidator : ICustomValidator
{
#region ICustomValidator Members
public void Validate(ModelStateDictionary modelState, FormCollection form)
{
// Don't bother with custom validation when attribute validation failed
if (modelState.IsValid)
{
string strSaleStartDate = form["saleStartDate"];
string strSaleEndDate = form["saleEndDate"];
// Verify that either both or neither saleStartDate and saleEndDate have values
if (!String.IsNullOrEmpty(strSaleStartDate) && String.IsNullOrEmpty(strSaleEndDate))
modelState.AddModelError("saleEndDate", strSaleEndDate, "sale end date must have a value when sale start date has a value.");
if (String.IsNullOrEmpty(strSaleStartDate) && !String.IsNullOrEmpty(strSaleEndDate))
modelState.AddModelError("saleStartDate", strSaleStartDate, "sale start date must have a value when sale end date has a value.");
// Verify that saleEndDate > saleStartDate
if (!String.IsNullOrEmpty(strSaleStartDate) && !String.IsNullOrEmpty(strSaleEndDate))
{
DateTime saleStartDate = DateTime.Parse(strSaleStartDate);
DateTime saleEndDate = DateTime.Parse(strSaleEndDate);
if (saleEndDate <= saleStartDate)
{
modelState.AddModelError("saleStartDate", strSaleStartDate, "sale start date must be before end date.");
modelState.AddModelError("saleEndDate", strSaleEndDate, "sale start date must be before end date.");
}
}
}
}
#endregion
}
}
using System.Web.Mvc;
using Microsoft.Web.Mvc;
using MvcValidation;
namespace MvcValidationWebsite.Validators
{
public class ProductValidator : ICustomValidator
{
#region ICustomValidator Members
public void Validate(ModelStateDictionary modelState, FormCollection form)
{
// Don't bother with custom validation when attribute validation failed
if (modelState.IsValid)
{
string strSaleStartDate = form["saleStartDate"];
string strSaleEndDate = form["saleEndDate"];
// Verify that either both or neither saleStartDate and saleEndDate have values
if (!String.IsNullOrEmpty(strSaleStartDate) && String.IsNullOrEmpty(strSaleEndDate))
modelState.AddModelError("saleEndDate", strSaleEndDate, "sale end date must have a value when sale start date has a value.");
if (String.IsNullOrEmpty(strSaleStartDate) && !String.IsNullOrEmpty(strSaleEndDate))
modelState.AddModelError("saleStartDate", strSaleStartDate, "sale start date must have a value when sale end date has a value.");
// Verify that saleEndDate > saleStartDate
if (!String.IsNullOrEmpty(strSaleStartDate) && !String.IsNullOrEmpty(strSaleEndDate))
{
DateTime saleStartDate = DateTime.Parse(strSaleStartDate);
DateTime saleEndDate = DateTime.Parse(strSaleEndDate);
if (saleEndDate <= saleStartDate)
{
modelState.AddModelError("saleStartDate", strSaleStartDate, "sale start date must be before end date.");
modelState.AddModelError("saleEndDate", strSaleEndDate, "sale start date must be before end date.");
}
}
}
}
#endregion
}
}
注意,上面这个ProductValidator实现了接口ICustomValidator。这个接口有一个要求你必须实现的方法,名字为Validate()。
列表4中的ProductValidator类首先检查当把一个日期提供给StartSaleDate或EndSaleDate属性时,这两个属性即都使用这一个日期相关内容预以赋值。仅指定一个开始销售日期而不指定终止日期实在没有多大意义。
接下来,ProductValidator校验器可以确保EndSaleDate的值大于StartSaleDate的值。如果存在一个错误,那么,一个新的错误消息即被添加到ModelState中以描述该错误。只要视图中包括一个HTML.ValidationMessage()调用(其中包括了校验错误键),那么该校验错误消息即可被显示。
你可以利用一个定制校验器执行任何复杂的校验任务。例如,如果你需要执行一个数据库查询确保一个唯一的值,那么你可以在这个定制的校验器类中执行该数据库查询。