ASP.Net MVC 4自定义验证属性isValid被调用两次

时间:2016-01-01 14:16:27

标签: c# asp.net asp.net-mvc validation asp.net-mvc-4

我正在尝试创建一个示例验证属性以了解有关MVC的更多信息。我已经创建了验证属性,但是当我运行应用程序时,验证属性被调用两次 - >在调用控制器之前和保存DBContext之前。我相信这应该只召唤一次。你能指导我在哪里做错了吗?

验证属性:我正在尝试验证属性是否包含的字数多于指定的maxWords

public class ValidationEx : ValidationAttribute
    {
        int _maxWords = 1;
        public ValidationEx()
            : base("{0} has more too many words")
        {
            _maxWords = 1;
        }

        public ValidationEx(int maxWords):base("{0} has more too many words")
        {
            _maxWords = maxWords;
        }

        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            if (value != null)
            {
                string data = value as string;
                if (data.Split(' ').Length > _maxWords)
                {
                    var errorMessage = FormatErrorMessage(validationContext.DisplayName);
                    return new ValidationResult(errorMessage);
                }
            }
            return ValidationResult.Success;
        }
    }

控制器:

[HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create(Album album)
        {
            if (ModelState.IsValid)
            {
                db.Albums.Add(album);
                db.SaveChanges();
                return RedirectToAction("Index");
            }

            ViewBag.GenreID = new SelectList(db.Genres, "GenreID", "Name", album.GenreID);
            ViewBag.ArtistID = new SelectList(db.Artists, "ArtistID", "ArtistName", album.ArtistID);
            return View(album);
        }

注意:在到达控制器之前和执行db.SaveChanges()

时会触发验证

型号:

 public class Album
    {
        public virtual int AlbumID { get; set; }
        public virtual int GenreID { get; set; }
        public virtual int ArtistID { get; set; }

        [Required(ErrorMessageResourceType= typeof(ErrorMessages), ErrorMessageResourceName="TitleRequired")]
        [Display(Name="Movie Name")]
        [ValidationEx()]
        public virtual string Title { get; set; }

        [Range(0,1000)]
        public virtual decimal Price { get; set; }
        public virtual string AlbumArtUrl { get; set; }
        public virtual Genre Genre { get; set; }
        public virtual Artist Artist { get; set; }

        [StringLength(40)]
        public virtual string Description { get; set; }
    }

的DbContext

public class MusicAlbumStoreDBContext : DbContext
    {
        // You can add custom code to this file. Changes will not be overwritten.
        // 
        // If you want Entity Framework to drop and regenerate your database
        // automatically whenever you change your model schema, add the following
        // code to the Application_Start method in your Global.asax file.
        // Note: this will destroy and re-create your database with every model change.
        // 
        // System.Data.Entity.Database.SetInitializer(new System.Data.Entity.DropCreateDatabaseIfModelChanges<MusicAlbumProject.Models.MusicAlbumStoreDBContext>());

        public MusicAlbumStoreDBContext() : base("name=MusicAlbumStoreDBContext")
        {
        }

        public DbSet<Album> Albums { get; set; }

        public DbSet<Genre> Genres { get; set; }

        public DbSet<Artist> Artists { get; set; }

        public DbSet<Order> Orders { get; set; }
    }

1 个答案:

答案 0 :(得分:3)

您使用的是与模型相同的类和视图模型。 MVC在这两种类型之间存在分歧是有原因的。你真的应该添加一个单独的模型和一个单独的视图模型类。

IsValid()被调用两次

  1. 在控制器操作之前,因为在调用操作之前验证了数据
  2. on db.SaveChanges()因为DB Context也进行了验证