四、 在论坛应用程序中添加表单校验支持
现在,既然我们有了一个简单的校验框架,那么接下来,我们便可以修改该论坛应用程序以利用上述校验技术。首先,我们想确保一个用户在没有提供一个消息主题和消息正文内容的情况下不能够把一个新的消息寄送到论坛中
因此,我们需要创建能够表达这一意图的单元测试。列表6中包含了两个新的单元测试。其中,第一个单元测试用于验证在没有提供一个消息主题时校验会失败;第二个单元测试用于验证当没有提供一个消息正文内容消时校验也会失败。
列表6–Controllers\ForumControllerTest.cs
[TestMethod]
public void EmptySubjectFailsValidation()
{
// Arrange
var controller = new ForumController(_repository);
// Act
var form = new FormCollection();
form.Add("author", "Stephen");
form.Add("subject", String.Empty);
form.Add("body", "Body of new thread");
var result = (ViewResult)controller.Create(form);
// Assert
Assert.IsFalse(result.ViewData.ModelState.IsValid);
}
[TestMethod]
public void EmptyBodyFailsValidation()
{
// Arrange
var controller = new ForumController(_repository);
// Act
var form = new FormCollection();
form.Add("author", "Stephen");
form.Add("subject", "New Message");
form.Add("body", String.Empty);
var result = (ViewResult)controller.Create(form);
// Assert
Assert.IsFalse(result.ViewData.ModelState.IsValid);
}
public void EmptySubjectFailsValidation()
{
// Arrange
var controller = new ForumController(_repository);
// Act
var form = new FormCollection();
form.Add("author", "Stephen");
form.Add("subject", String.Empty);
form.Add("body", "Body of new thread");
var result = (ViewResult)controller.Create(form);
// Assert
Assert.IsFalse(result.ViewData.ModelState.IsValid);
}
[TestMethod]
public void EmptyBodyFailsValidation()
{
// Arrange
var controller = new ForumController(_repository);
// Act
var form = new FormCollection();
form.Add("author", "Stephen");
form.Add("subject", "New Message");
form.Add("body", String.Empty);
var result = (ViewResult)controller.Create(form);
// Assert
Assert.IsFalse(result.ViewData.ModelState.IsValid);
}
为了顺利通过这些新的单元测试,我们需要修改我们的论坛控制器。该新版本的论坛控制器包含在列表7中。
列表7–Controllers\ForumController.cs
using System;
using System.Web.Mvc;
using MvcForums.Models;
using Microsoft.Web.Mvc;
using MvcValidation;
namespace MvcForums.Controllers
{
public class ForumController : Controller
{
private IForumRepository _repository;
public ForumController()
: this(new ForumRepository())
{ }
public ForumController(IForumRepository repository)
{
_repository = repository;
}
public ActionResult Index()
{
ViewData.Model = _repository.SelectThreads();
return View("Index");
}
[AcceptVerbs("GET")]
public ActionResult Create()
{
return View("Create");
}
[AcceptVerbs("Post")]
public ActionResult Create(FormCollection form)
{
// Validate
Validation.Validate<Message>(ViewData.ModelState, form);
if (!ViewData.ModelState.IsValid)
return View("Create", form);
// Create new message
var messageToCreate = new Message();
if (!String.IsNullOrEmpty(form["parentThreadId"]))
messageToCreate.ParentThreadId = int.Parse(form["parentThreadId"]);
if (!String.IsNullOrEmpty(form["parentMessageId"]))
messageToCreate.ParentMessageId = int.Parse(form["parentMessageId"]);
messageToCreate.Author = form["author"];
messageToCreate.Subject = form["subject"];
messageToCreate.Body = form["body"];
messageToCreate.EntryDate = DateTime.Now;
// Add to database
_repository.AddMessage(messageToCreate);
// Redirect
return RedirectToAction("Index");
}
public ActionResult Thread(int threadId)
{
ViewData.Model = _repository.SelectMessages(threadId);
return View("Thread");
}
}
}
using System.Web.Mvc;
using MvcForums.Models;
using Microsoft.Web.Mvc;
using MvcValidation;
namespace MvcForums.Controllers
{
public class ForumController : Controller
{
private IForumRepository _repository;
public ForumController()
: this(new ForumRepository())
{ }
public ForumController(IForumRepository repository)
{
_repository = repository;
}
public ActionResult Index()
{
ViewData.Model = _repository.SelectThreads();
return View("Index");
}
[AcceptVerbs("GET")]
public ActionResult Create()
{
return View("Create");
}
[AcceptVerbs("Post")]
public ActionResult Create(FormCollection form)
{
// Validate
Validation.Validate<Message>(ViewData.ModelState, form);
if (!ViewData.ModelState.IsValid)
return View("Create", form);
// Create new message
var messageToCreate = new Message();
if (!String.IsNullOrEmpty(form["parentThreadId"]))
messageToCreate.ParentThreadId = int.Parse(form["parentThreadId"]);
if (!String.IsNullOrEmpty(form["parentMessageId"]))
messageToCreate.ParentMessageId = int.Parse(form["parentMessageId"]);
messageToCreate.Author = form["author"];
messageToCreate.Subject = form["subject"];
messageToCreate.Body = form["body"];
messageToCreate.EntryDate = DateTime.Now;
// Add to database
_repository.AddMessage(messageToCreate);
// Redirect
return RedirectToAction("Index");
}
public ActionResult Thread(int threadId)
{
ViewData.Model = _repository.SelectMessages(threadId);
return View("Thread");
}
}
}