2012-10-10 85 views
1

我有一个asp.net mvc3 w/ado.net实体框架做了一些验证。验证与ViewModel

我创建了一个视图模型本身

public class id 
{ 


    [Required] 
    public decimal l_ID 
    { 
     get; 
     set; 
    } 

    [Required] 
    public decimal v_ID 
    { 
     get; 
     set; 
    } 
} 

是否有可能增加一些组验证规则,使l_id必须比v_id大?验证应该在用户提交页面后完成。这将如何完成?任何教程?此验证是否需要在控制器中完成或使用部分类?是否有任何的例子在那里的MVVM模式存在

回答

2

我一直在使用IValidatable接口,与自定义属性验证相比,它非常简单。下面的代码:

public class id : IValidatableObject 
    { 
     [Required] 
     public decimal l_ID { get; set; } 

     [Required] 
     public decimal v_ID { get; set; } 

     private bool _hasBeenValidated = false; 

     public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
     { 

      if (!_hasBeenValidated) 
      { 
       // validation rules go here. 
       if (l_ID <= v_ID) 
        yield return new ValidationResult("Bad thing!", new string[] { "l_ID" }); 
      } 

      _hasBeenValidated = true; 
     } 
    } 

夫妇的音符,当绑定从POST用语,使视图模型的参数发生验证方法是自动调用,所以你没有做任何接线,事件。 bool _hasBeenValidated的东西是在那里,因为现在MVC3(imho)中有一个准确的错误,在某些情况下调用验证方法两次(就像这个ViewModel也用作另一个ViewModel的成员并被发布

ValidationResult构造函数的第二个参数是验证绑定到的属性的名称,所以在这种情况下,您的View中的l_ID的ValidatorFor标记将会在其中获得“Bad thing”消息。

+0

太棒了!这工作。只是一个快速跟进问题。如果我想将输入v_ID的用户与从URL传入的参数进行比较,那么验证规则将如何更改,如何从浏览器中获取该参数。 – deep

+0

ViewModel的URL参数部分,还是可以?我就是这么做的。 ViewModel应该包含“页面”运行操作所需的所有内容。一旦所有内容都在ViewModel中,Validate方法只需查看这些字段即可完成其逻辑。用特定的scenerio回到这里,或者打开一个更新,更具体的问题(并让我知道)。 – Graham

+0

是的,我添加了两个字段,如old_v_id和old_l_id到viewmodel,我现在应该可以使用它。非常感谢 – deep

1

视图模型,为你和你的MVC使用的控制器,模型和视图

是,你可以在你的模型添加DataAnnotation。

链接:http://www.asp.net/mvc/tutorials/older-versions/models-%28data%29/validation-with-the-data-annotation-validators-cs

+0

嘿,我已经检查过,这就是为什么我有[必需]语句,但我问什么是我如何有条件验证 – deep

+0

MVC中有一个ViewModels的地方,但它们的含义是不同于ViewModels在MVVM。这只是DTO的变体。 – Pein

0

我建议您使用Fluent Validation组件。它可以是integrated with Asp.Net MVC,您可以使用流畅的sintaxe轻松添加一些验证规则。 DataAnnotations也能正常工作,但我不喜欢,因为它会污染你的域模型或视图模型。我喜欢创建一个单独的职责结构。

1

您需要创建自定义验证属性 - 网上有很多帮助。以下是对类似依赖属性的改编。

public class GreaterThanOtherAttribute : ValidationAttribute, IClientValidatable 
{ 
    public string DependentProperty { get; set; } 

    public GreaterThanOtherAttribute (string dependentProperty) 
    { 
     this.DependentProperty = dependentProperty; 
    } 

    protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
    { 
     // get a reference to the property this validation depends upon 
     var containerType = validationContext.ObjectInstance.GetType(); 
     var field = containerType.GetProperty(this.DependentProperty); 

     if (field != null) 
     { 
      // get the value of the dependent property 
      var dependentvalue = field.GetValue(validationContext.ObjectInstance, null); 

      // compare the value against the target value 
      if ((dependentvalue == null && this.TargetValue == null) || 
       (dependentvalue != null && dependentvalue < this.TargetValue))) 
      { 
       // match => means we should try validating this field 
       return new ValidationResult(this.ErrorMessage, new[] { validationContext.MemberName }); 
      } 
     } 

     return ValidationResult.Success; 
    } 

,然后装点你的模型:

public class id   
{  
    [Required]   
    public decimal l_ID   
    {   
     get;   
     set;   
    }   

    [Required] 
    [GreaterThanOtherAttribute("l_ID")]   
    public decimal v_ID   
    {   
     get;   
     set;   
    }   
}  

你现在需要做的是找到一个示例自定义属性,并适应它使用上面。

健康警告 - 这未经任何测试,可能包含错误。

祝你好运!