日期:2014-05-17  浏览次数:21047 次

Asp.net MVC 通过Attribute验证datamodel(一)

1. 除了可以使用Required, StringLength等Attribute,asp.net mvc中还可以自定义属于自己的验证Attribute。

例如:

//验证逻辑就是判断专辑的Title是否包含某一个关键字
    public class AlbumTitleValidateAttribute : ValidationAttribute
    {
        private readonly string _keyword;

        public AlbumTitleValidateAttribute(string keyword)
        {
            if (string.IsNullOrEmpty(keyword))
                throw new Exception("invalid usage");
            _keyword = keyword;
        }

        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            if (value != null && value.ToString().ToUpper().Contains(_keyword.ToUpper()))
            {
                return ValidationResult.Success;
            }
            else
                return new ValidationResult(string.Format("Title does not contain the keyword({0})", _keyword));
        }
    }


 

2.定义DataModel,并且使用上面定义的attribute

public class Album
    {
        public int ID { get; set; }
        [Required]
        [AlbumTitleValidateAttribute("月亮")]
        public string Title { get; set; }
        [Required]
        [StringLength(3)]
        public string Author { get; set; }
    }


这里定义专辑的Title必须包含有“月亮”二字

 

3. 绑定属性到前台页面

@using (Html.BeginForm("Index", "Home", FormMethod.Post))
{
    <p>
        @Html.EditorFor(m => m.Title)
        @Html.ValidationMessageFor(m => m.Title)
    </p>

    <p>
        @Html.EditorFor(m => m.Author)
        @Html.ValidationMessageFor(m => m.Author)
    </p>

    @Html.HiddenFor(m => m.ID)
                          
    <input type="submit" value="submit" />
}


 

4. 添加Action在Controller.

[HttpPost]
        public ActionResult Index(Album album)
        {
            if (ModelState.IsValid)
            {
                return RedirectToAction("About");
            }
            return View(album);
        }


运行程序,然后就可以在前台页面修改一些值,看到验证效果