技术开发 频道

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

  上述这个实现校验的方法是一种命令式编程方法。该校验规则是通过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;
}

  使用命令式方法可以使你能够执行你所需要的任何类型的校验。例如,在把一条消息插入到数据库之前,你可以执行一个数据库查询以确保消息主题和正文在数据库中都是唯一的。

  三、 使用声明性方法进行表单校验

  一般的程序员都喜欢使用声明性方法实现表单校验。声明性方法能够使你校验表单数据而不用编写任何代码。
 
  使用声明性方法的另一个优点是,声明性方法能够使你非常容易地实现客户端校验。我们的一个想法是,从我们的服务器端校验器生成客户端校验器。通过这种方式,我们可以校验一个表单而不必把表单回寄到服务器端。
列表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

    }
}
0
相关文章