2016-12-23 103 views
6

我想OT覆蓋RequiresAttribute在.NET的核心似乎並沒有對asp.net 1.1核心在asp.net核心覆蓋現有數據註釋屬性1.1

在這裏工作是測試代碼

public class CustomRequiredAttribute : RequiredAttribute 
{ 
    public CustomRequiredAttribute():base() 
    { 

    } 

    public override string FormatErrorMessage(string name) 
    { 
     return base.FormatErrorMessage(name); 
    } 

    protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
    { 
     return base.IsValid(value, validationContext); 
    } 

} 

一旦用在我的模型我期待的正常結果,如「字段是必須的」,因爲我沒有定製這些事,只是調用基方法。

這似乎並不如預期的工作,只是繞過所需在客戶端和服務器端。

這樣做的目的是將從數據庫中提取的驗證消息添加到ErrorMessage屬性中。

任何建議,將不勝感激。

+0

你不重寫它,你正在創建一個派生類。你能展示你如何使用它? – Klinger

+0

我正在派生,一旦它的工作將重寫某些方法,我使用它作爲標準模型,即[CustomRequired]公共字符串名稱{get; set;}我希望作爲intented它會調用isvalid但斷點從未命中。 – AliK

+1

看看這是否有助於:http://stackoverflow.com/questions/12573362/extending-the-mvc-requiredattribute – Klinger

回答

2

您的問題是,作爲默認實現IValidationAttributeAdapterProviderValidationAttributeAdapterProvider僅檢查特定類型。因此,使用自定義實現導致缺少「適配器提供者」,這導致缺少數據屬性。

解決方案:提供自己實現IValidationAttributeAdapterProvider,可轉發到非定製的東西默認實現...

public class CustomValidationAttributeAdapterProvider : IValidationAttributeAdapterProvider 
{ 
    private IValidationAttributeAdapterProvider innerProvider = new ValidationAttributeAdapterProvider(); 

    public IAttributeAdapter GetAttributeAdapter(ValidationAttribute attribute, IStringLocalizer stringLocalizer) 
    { 
     if (attribute == null) 
      throw new ArgumentNullException(nameof(attribute)); 

     var type = attribute.GetType(); 

     if (type == typeof(CustomRequiredAttribute)) 
      return new RequiredAttributeAdapter((RequiredAttribute)attribute, stringLocalizer); 

     return innerProvider.GetAttributeAdapter(attribute, stringLocalizer); 
    } 
} 

...並將其註冊爲一個單例。

services.AddSingleton<IValidationAttributeAdapterProvider, CustomValidationAttributeAdapterProvider>(); 
+0

我已經厭倦了類似的東西,我相信這是正確的方向。 – AliK

+0

@AliK它確實有效。或者我錯過了一些重要的步驟? –

+0

我遵循了類似的模式,但是這也應該起作用。現在的問題在於,您知道框架不斷變化,因此現在可以看到MS的新版本會發生什麼。 – AliK