3

我有一個實體子類的屬性,我想驗證它是否爲null。使用數據標註進行編程驗證?

我不能與[Required]屬性對它進行註釋,因爲然後根據需要在EF解析器解釋它。我只希望它是這種類型所必需的(它是一個繼承的實體)。

事情是我使用的顯示資源,在我的項目,我想屬性名和錯誤消息從資源檢索。

實體實現IValidatableObject,所以我想添加Validator.TryValidateObject並自動獲取定製的驗證錯誤,但它需要的ValidationContext我要使用其constructor一個實例,需要一個Dictionary<object, object>,這我不知道它的參數需要。我確定這是我正在尋找的構造函數,因爲我正在尋找一種方法來指定實例和成員名稱,以便驗證程序自動提取顯示變量。

我不介意以任何其他方式做這件事,但我更喜歡一種開箱即用的方式,系統關心使用屬性的顯示名稱和從中獲取的錯誤消息格式化驗證錯誤資源。

無論如何,我想請問,如何在Validator類獲得的顯示名稱內部?是否有任何此功能暴露?
另一個問題將是如何的ValidationContext設置MemberName內部?何我可以自己構建這樣一個ValidationContext

回答

1

貌似我沒有意識到,但ValidationContext.MemberName屬性是可讀寫的。

我最終使用下列內容:

public IEnumerable<ValidationResult> IValidatableObject.Validate(
    ValidationContext validationContext) 
{ 
    var context = new ValidationContext(this) { MemberName = nameof(BirthDate) }; 
    var dateResults = new List<ValidationResult>(); 
    if (!Validator.TryValidateValue(this.BirthDate, context, dateResults, 
    new[] 
    { 
     new RequiredAttribute 
     { 
     ErrorMessageResourceType = typeof(ValidationResx), 
     ErrorMessageResourceName = Resx.Required 
     } 
    })) 
    foreach (var dateResult in dateResults) 
     yield return dateResult; 
} 

我可以做的另一種選擇,就是設置屬性爲DbContext.OnModelCreating的流暢API中NotRequired