上述这个实现校验的方法是一种命令式编程方法。该校验规则是通过GetRuleViolations()方法中命令式的编程代码实现的,如下所示:
public List<RuleViolation> GetRuleViolations()
{
var validationIssues = new List<RuleViolation>();
// Validate Subject
if (String.IsNullOrEmpty(this.Subject))
validationIssues.Add(new RuleViolation("subject", this.Subject, "You must enter a message subject."));
// Validate Body
if (String.IsNullOrEmpty(this.Body))
validationIssues.Add(new RuleViolation("body", this.Body, "You must enter a message body."));
return validationIssues;
}
{
var validationIssues = new List<RuleViolation>();
// Validate Subject
if (String.IsNullOrEmpty(this.Subject))
validationIssues.Add(new RuleViolation("subject", this.Subject, "You must enter a message subject."));
// Validate Body
if (String.IsNullOrEmpty(this.Body))
validationIssues.Add(new RuleViolation("body", this.Body, "You must enter a message body."));
return validationIssues;
}
使用命令式方法可以使你能够执行你所需要的任何类型的校验。例如,在把一条消息插入到数据库之前,你可以执行一个数据库查询以确保消息主题和正文在数据库中都是唯一的。
三、 使用声明性方法进行表单校验
一般的程序员都喜欢使用声明性方法实现表单校验。声明性方法能够使你校验表单数据而不用编写任何代码。
使用声明性方法的另一个优点是,声明性方法能够使你非常容易地实现客户端校验。我们的一个想法是,从我们的服务器端校验器生成客户端校验器。通过这种方式,我们可以校验一个表单而不必把表单回寄到服务器端。
列表8中修改过的Message类即使用一个声明性方法实现了有关表单域的校验。
列表8–Message.cs
using System;
using MvcValidation;
using System.Collections.Generic;
using System.Data.Linq;
using MvcValidation.Attributes;
using System.Web.Mvc;
namespace MvcForums.Models.Entities
{
public class Message :IRuleEntity
{
private DateTime _entryDate = DateTime.Now;
public Message()
{ }
public Message(int id, int? parentThreadId, int? parentMessageId, string author, string subject, string body)
{
this.Id = id;
this.ParentThreadId = parentThreadId;
this.ParentMessageId = parentMessageId;
this.Author = author;
this.Subject = subject;
this.Body = body;
}
public int Id { get; set; }
public int? ParentThreadId { get; set; }
public int? ParentMessageId { get; set; }
public string Author { get; set; }
[RequiredValidator("You must enter a message subject.")]
public string Subject { get; set; }
[RequiredValidator("You must enter a message body.")]
public string Body { get; set; }
public DateTime EntryDate
{
get { return _entryDate; }
set { _entryDate = value; }
}
#region IRuleEntity Members
public List<RuleViolation> GetRuleViolations()
{
var validationIssues = new List<RuleViolation>();
// Validate attributes
AttributeValidation.Validate(this, validationIssues);
return validationIssues;
}
public void Validate()
{
var validationIssues = GetRuleViolations();
if (validationIssues.Count > 0)
throw new RuleViolationException("Validation Issues", validationIssues);
}
#endregion
}
}
using MvcValidation;
using System.Collections.Generic;
using System.Data.Linq;
using MvcValidation.Attributes;
using System.Web.Mvc;
namespace MvcForums.Models.Entities
{
public class Message :IRuleEntity
{
private DateTime _entryDate = DateTime.Now;
public Message()
{ }
public Message(int id, int? parentThreadId, int? parentMessageId, string author, string subject, string body)
{
this.Id = id;
this.ParentThreadId = parentThreadId;
this.ParentMessageId = parentMessageId;
this.Author = author;
this.Subject = subject;
this.Body = body;
}
public int Id { get; set; }
public int? ParentThreadId { get; set; }
public int? ParentMessageId { get; set; }
public string Author { get; set; }
[RequiredValidator("You must enter a message subject.")]
public string Subject { get; set; }
[RequiredValidator("You must enter a message body.")]
public string Body { get; set; }
public DateTime EntryDate
{
get { return _entryDate; }
set { _entryDate = value; }
}
#region IRuleEntity Members
public List<RuleViolation> GetRuleViolations()
{
var validationIssues = new List<RuleViolation>();
// Validate attributes
AttributeValidation.Validate(this, validationIssues);
return validationIssues;
}
public void Validate()
{
var validationIssues = GetRuleViolations();
if (validationIssues.Count > 0)
throw new RuleViolationException("Validation Issues", validationIssues);
}
#endregion
}
}