技术开发 频道

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

  具体地说,上面的校验是借助于下列三行代码实现的:
 

Validation.Validate<Product>(ViewData.ModelState, form);
if (!ViewData.ModelState.IsValid)
  
return View("Create", form);

  这个Validation.Validate()方法对传递到控制器行为的form参数进行校验。当遇到校验错误时,即把该错误添加到ModelState。如果存在任何校验错误,该ModelState.IsValid属性将返回值False并且再次显示Create视图。当再次显示Create视图时,用户输入的所有的值也都重新显示(注意:上面这个form变量是被作为ViewData传递到Create视图中的)。

  请注意,你必须指定如何在模型中校验表单中的域(因为我们所设计的校验是模型驱动型的)。列表3中提供了此Product类的实现代码。
  列表3–Models\Product.cs

using System;
using MvcValidation;
using System.Web.Mvc;
using Microsoft.Web.Mvc;
using MvcValidationWebsite.Validators;

namespace MvcValidationWebsite.Models
{
    [CustomValidator(
typeof(ProductValidator))]
    
public class Product
    {
        
public int Id { get; set; }

        [RequiredValidator(
"Product name is required.")]
        
public string Name { get; set; }

        [RequiredValidator(
"Product price is required.")]
        [USCurrencyValidator(
"Product price is not a valid currency amount.")]
        
public decimal Price { get; set; }

        [RequiredValidator(
"Product description is required")]
        [LengthValidator(
50, "Description too long.")]
        
public string Description { get; set; }

        [TypeValidator(
typeof(DateTime), "Sale start date must be a valid date.")]
        
public DateTime? SaleStartDate { get; set; }

        [TypeValidator(
typeof(DateTime), "Sale end date must be a valid date.")]
        
public DateTime? SaleEndDate { get; set; }
    }
}

  注意,上面的校验器属性被应用到Product属性上。例如,Name属性就被标记以RequiredValidator属性。由相应的校验器指定的错误消息最终将被显示到页面视图中。

  值得注意的,有一个校验器属性需要多作一些解释。CustomValidator被应用到了类定义的前面,而不是一个类的某个属性上。此外,该CustomValidator校验器还支持你执行更复杂的校验逻辑—其中有可能涉及到多个属性。

  例如,Product类就使用了两个属性,一个是StartSaleDate,另一个是EndSaleDate属性;它们共同描述了产品待销售期间的时间段。注意,EndSaleDate属性应该总是位于StartSaleDate属性之后。列表3中的CustomValidator用于强行实施这个校验逻辑。

0
相关文章