2012-10-10 108 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;   
    }   
}  

你現在需要做的是找到一個示例自定義屬性,並適應它使用上面。

健康警告 - 這未經任何測試,可能包含錯誤。

祝你好運!