列表4–Validation.cs
using System.Web.Mvc;
namespace MvcValidation
{
public class Validation
{
public static void UpdateModelStateWithViolations(RuleViolationException ruleViolationException, ModelStateDictionary modelState)
{
foreach (var issue in ruleViolationException.ValidationIssues)
{
var value = issue.PropertyValue ?? string.Empty;
modelState.AddModelError(issue.PropertyName, value.ToString(), issue.ErrorMessage);
}
}
}
}
namespace MvcValidation
{
public class Validation
{
public static void UpdateModelStateWithViolations(RuleViolationException ruleViolationException, ModelStateDictionary modelState)
{
foreach (var issue in ruleViolationException.ValidationIssues)
{
var value = issue.PropertyValue ?? string.Empty;
modelState.AddModelError(issue.PropertyName, value.ToString(), issue.ErrorMessage);
}
}
}
}
让我们来看一下上面所有这些类是如何协同工作的。首先注意到,列表5中的Message类描述了一个论坛消息。注意,这个类通过实现Validate()和GetRuleViolations()方法实现了IRuleEntity接口。
列表5–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; }
public string Subject { get; set; }
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 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;
}
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; }
public string Subject { get; set; }
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 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;
}
public void Validate()
{
var validationIssues = GetRuleViolations();
if (validationIssues.Count > 0)
throw new RuleViolationException("Validation Issues", validationIssues);
}
#endregion
}
}