技术开发 频道

MVC框架开发Web论坛之表单校验篇

  注意,当你把一个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
    }
}

  注意,上面这个ProductValidator实现了接口ICustomValidator。这个接口有一个要求你必须实现的方法,名字为Validate()。
列表4中的ProductValidator类首先检查当把一个日期提供给StartSaleDate或EndSaleDate属性时,这两个属性即都使用这一个日期相关内容预以赋值。仅指定一个开始销售日期而不指定终止日期实在没有多大意义。

  接下来,ProductValidator校验器可以确保EndSaleDate的值大于StartSaleDate的值。如果存在一个错误,那么,一个新的错误消息即被添加到ModelState中以描述该错误。只要视图中包括一个HTML.ValidationMessage()调用(其中包括了校验错误键),那么该校验错误消息即可被显示。

  你可以利用一个定制校验器执行任何复杂的校验任务。例如,如果你需要执行一个数据库查询确保一个唯一的值,那么你可以在这个定制的校验器类中执行该数据库查询。
 

0
相关文章