2016-12-22 203 views
0

我是新來的MVC和我通過一些驗證工作對象的屬性的總和。我已經在模型級別完成了基本的字段驗證(必需的,範圍等)。我現在正在研究一個基本上用權重來構建記分卡的頁面。我需要每一個權重爲每個標準加起來爲1驗證在ASP.NET MVC 4 - 驗證

我不知道我是否可以驗證這個模型,因爲我需要在數據庫中創建這些對象,因爲它們是能力添加。在用戶進入下一步之前,如何驗證這些屬性中的每個屬性合計爲1?

+3

您可以創建自定義驗證。 – Luther

+0

我的第一個想法是在你的ViewModel上使用一個IValidatableObject接口,它爲你提供了一種編寫自定義代碼的方法,它可以像屬性驗證代碼一樣創建驗證錯誤。 http://stackoverflow.com/questions/3400542/how-do-i-use-ivalidatableobject – Graham

回答

0

基本上是後端,你需要創建一個可以被用做在該領域的屬性來驗證自定義驗證。

這是檢查,如果「數比另一種更大的日提交的」驗證的一個例子。

[AttributeUsage(AttributeTargets.Property, AllowMultiple = true)] 
    public class NumberGreaterThanAttribute : ValidationAttribute, IClientValidatable 
    { 
     string otherPropertyName; 


     public NumberGreaterThanAttribute(string otherPropertyName, string errorMessage) 
      : base(errorMessage) 
     { 
      this.otherPropertyName = otherPropertyName; 
     } 

     protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
     { 
      ValidationResult validationResult = ValidationResult.Success; 


      if (value == null) 
       return validationResult; 

      try 
      { 
       // Using reflection we can get a reference to the other date property, in this example the project start date 
       var otherPropertyInfo = validationContext.ObjectType.GetProperty(this.otherPropertyName); 
       object referenceProperty = otherPropertyInfo.GetValue(validationContext.ObjectInstance, null); 

       if (referenceProperty == null) 
        return validationResult; 

       double referenceProperty_value = System.Convert.ToDouble(referenceProperty, null); 
       double currentField_value = System.Convert.ToDouble(value, null); 


       if (currentField_value <= referenceProperty_value) 
       { 
        validationResult = new ValidationResult(ErrorMessageString); 
       } 

      } 
      catch (Exception ex) 
      { 

       throw ex; 
      } 


      return validationResult; 
     } 


     public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) 
     { 
      //string errorMessage = this.FormatErrorMessage(metadata.DisplayName); 
      string errorMessage = ErrorMessageString; 

      // The value we set here are needed by the jQuery adapter 
      ModelClientValidationRule numberGreaterThanRule = new ModelClientValidationRule(); 
      numberGreaterThanRule.ErrorMessage = errorMessage; 
      numberGreaterThanRule.ValidationType = "numbergreaterthan"; // This is the name the jQuery adapter will use 
      //"otherpropertyname" is the name of the jQuery parameter for the adapter, must be LOWERCASE! 
      numberGreaterThanRule.ValidationParameters.Add("otherpropertyname", otherPropertyName); 

      yield return numberGreaterThanRule; 
     } 
    } 

記住:對於自定義/新創建的驗證,前端驗證不會自動啓用。如果您想爲前端創建相同的驗證規則,則需要創建一個新的前端自定義驗證。我通常使用validate.js庫作爲前端。不過,如果您不介意將數據從服務器推送到客戶端,特別是在數據量較小的情況下,前端驗證並不是嚴格要求(但我會建議使用它)。當後端接收到該請求(通常爲POST)

的視圖模型/型號將被接收和解析由ModelState中。

public Int64? AtomicQtyMultiplePurchaseMin { get; set; } 


    [NumberGreaterThanAttribute("AtomicQtyMultiplePurchaseMin", "Must be greater than min num. qty. of purchase")] 
    public Int64? AtomicQtyMultiplePurchaseMax { get; set; } 

我一般把自定義的驗證類在以下文件夾(但你可以把它放在你的項目想):該模型/視圖模型應該在需要驗證作爲這樣的領域進行裝飾

enter image description here

+0

這可能是一個愚蠢的問題,但如果你會添加自定義的驗證?在控制器中? – sdre9

+0

你想要的地方。您可以在根項目中創建一個名爲「mycustomvalidations」的文件夾。當您將驗證屬性應用於viewmodel的字段時,請記住使用using語句引用驗證類。 – Luther