2014-01-23 94 views
0

此問題與Asp.net MVC5相關。 類似的問題回答這裏: https://stackoverflow.com/questions/7674841/net-mvc3-conditionally-validating-property-which-relies-on-parent-object-proper在驗證上下文中獲取子屬性中的父對象屬性值

我有以下視圖模型:

public class ParentModel 
{ 
    public DateTime EffectiveDate {get;set} 
    public List<ChildModel> Children {get;set;} 
    ..... 
    ..... 
} 
public class ChildModel 
{ 
    [DateOfBirthRange(ErrorMessage="Date of Birth must be within range")] 
    public DateTime DateOfBirth {get;set} 
    ...... 
    ....... 
} 

public class DateOfBithRange : ValidationAttribute,IClientValidatable 
{ 
    public override ValidationResult(object value, ValidationContext validationContext) 
    { 
     //here validationContext.ObjectInstance is ChildModel 
     //How do i get the Effective Date of ParentModel? 
    } 
} 

ChildModel是一個列表,我需要在ParentModel

回答

0

,以驗證所有子模型WRT生效日期值的DateOfBith您需要將ChildModel類中的導航屬性返回給其父級。然後,您可以執行以下操作:

public override ValidationResult(object value, ValidationContext validationContext) 
{ 
    var childModel= validationContext.ObjectInstance as ChildModel; 
    var effectiveDate = childModel.Parent.EffectiveDate; 
    // do your tests against effectiveDate and childModel date 
} 
+0

ChildModel沒有屬性Parent.I不需要是否有任何方式獲取ModelBinded在發佈到此ValidationContext中的服務器上的ParentModel。 – ManojAnavatti

+0

給你的ChildModel一個導航屬性,以便它*可以*返回到父項,並且是 - 否則你怎麼能期望找到父項?給它這個屬性應該是微不足道的。 – Mashton

+0

@Mashton它給孩子模型一個導航屬性返回到父模型不是微不足道的,因爲導航屬性如何從表單回傳填充? –

0

基於.NET DataAnnotations的驗證不提供遞歸驗證。但是,您可以按照here的解釋擴展它。這樣做,您可以控制ValidationContext(用於驗證子對象)的創建方式。

因此,在提到文章的ValidateObjectAttribute,實例在IsValidValidationContext時,強似null作爲服務提供者,你可以通過自定義IServiceProvider,讓你父驗證環境和使用其ObjectInstance你父對象被驗證。