0

使用MVC3和EF4.1如何在客戶端和服務器上驗證我的視圖模型中的多個字段?MVC3/EF CustomValidator模型中的兩個字段

我有一個開始日期文本框(可以修改),我有隱藏字段中的原始開始日期。當用戶提交表格時,我想檢查修改的開始日期不超過原始開始日期的任何一個月的一個月。

我不明白如何使用DataAnnotation和CustomValidation完成這項工作(或者我可能會走錯路)?這是whay我一直在工作的例子:

[MetadataType(typeof(Metadata.MyUserMetaData))] 
public partial class MyUser 
{ 
    public System.DateTime DateOfBirth { get; set; }  
} 

分部類

public class MyUserMetaData 
{ 
    [CustomValidation(typeof(AmendedStartDate), "amendedstartdate", ErrorMessage = "Invalid date."] 
    public DateTime StartDate { get; set; }; 

    public DateTime OriginalStartDate { get; set; }; 
} 

自定義驗證

public class AmendedStartDate : ValidationAttribute, IClientValidatable 
{ 
    protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
    { 
     // How do I get multiple field values from object value? 
    } 

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(Modelmetadata metadate, ControllerContext context) 
    { 
     var rule = new ModelClientValidationRule 
     { 
     ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()), 
      ValidationType = "amendedstartdate" 
     }; 

     yield return rule; 
    } 
} 

我知道我仍然將jQuery添加到視圖對於這個驗證器。

回答

2

在您的模型類上使用數據註釋實現IValidatableObject而不是在具有交叉驗證的場景中更簡單和更清晰。

如果你仍然想使用ValidationAttribute你在IsValid方法兩個參數:

  • value表示在屬性分配
  • context屬性的驗證值是上下文該財產被驗證。它還包含ObjectInstanceObjectType屬性來訪問整個模型及其類型,以便您可以投射實例並訪問其他屬性。
+0

謝謝拉迪斯拉夫。我接受了@counsellorben的答案,因爲我已經走下了這條路,但下一次肯定會看到你的解決方案。 – nrg

相關問題