2012-03-12 46 views
0

我有一个模型实现了IValidatlableObject,并通过Validate方法进行自定义错误检查。仅在某些操作中使用IValidatableObject

当我创建一个对象时一切正常,但是当我尝试编辑该对象时,我不想执行该自定义验证。

我怎么知道从什么行动我调用验证方法,以便不做验证?

更新: 这是心肌梗死模型:

public class Ingredient : IValidatableObject 
{ 
    public int Id { get; set; } 

    [Required(ErrorMessage = "Required!!")] 
    public string Name { get; set; } 

    public virtual List<Product> Products { get; set; } 

    public Ingredient() 
    { 
     Products = new List<Product>(); 
    } 

public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 
     using (var uow = new UnitOfWork()) 
     { 
      var ingredient = uow.IngredientRepository.Get(i => i.Name ==Name).FirstOrDefault(); 

      if (ingredient != null) 
       yield return new ValidationResult("Duplicate!!!.", new[] { "Name" }); 
     } 


    } 
} 

}

所以当我创建的成分我想验证ALL(属性+ IValidatable) 但是当我编辑Ingrendient我只想验证属性(所以我的意思是跳过IValidatable) 任何方法来知道,在IValidatable方法,我从哪里调用验证?

谢谢!模型的

回答

2

检查主键 - 不管是不是空:)

+0

我没有想到它,但是,是的,这可能是一个不错的解决方案!!!所以我认为没有办法知道行动/控制器里面的验证方法 – Tekno 2012-03-12 20:21:46

0

如果你不想验证对象,不叫Model.IsValid(或Validate(),如果你明确做就可以了。如果不知道更多关于你的问题的详细信息,那么回答的不仅仅是这些,

1

这里更多的“MVCish”正确的方法是你实际上有两个类,一个用于编辑的Create方法,一个用于编辑类的任何共享验证,任何然后不共享不会被检查在这里。

+0

但它会有点难看!两个相同的类只用于验证。没有太多的干燥和不可控的。我认为这是您必须在纯MVC或lessMVC之间进行选择的时候,但更易于维护 - – Tekno 2012-03-12 20:41:08

+0

这并不违反DRY。 DRY适用于逻辑复制,而不是查看模型。这是MVC标准。如果你在viewmodel中关注它,那么它们都从共享道具的单一来源继承,你在这里保存的是什么 - 创建和编辑方法有两个独立的目的,你会发现应用程序得到更复杂的视图模型可以帮助。 – 2012-03-13 23:00:06

相关问题