技术开发 频道

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

  四、 在论坛应用程序中添加表单校验支持

  现在,既然我们有了一个简单的校验框架,那么接下来,我们便可以修改该论坛应用程序以利用上述校验技术。首先,我们想确保一个用户在没有提供一个消息主题和消息正文内容的情况下不能够把一个新的消息寄送到论坛中
 
  因此,我们需要创建能够表达这一意图的单元测试。列表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);
}

   为了顺利通过这些新的单元测试,我们需要修改我们的论坛控制器。该新版本的论坛控制器包含在列表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");
        }

    }
}
0
相关文章