2016-09-16 51 views
0

我正在開發ASP.NET MVC應用程序。我找到了Fluent Validation偉大的驗證工具,它的工作原理,但與我目前的架構,它有一個缺點。驗證器不關心元數據。爲了清晰起見,我在單獨的類上使用元數據。如何在MetadataTypeAttribute中使用FluentValidation?

型號

[MetadataType(typeof(DocumentEditMetadata))] 
[Validator(typeof(DocumentValidator))] 
public class DocumentEditModel 
{ 
    public string DocumentNumber { get; set; } 
    (etc...) 
} 

元數據模型

public class DocumentEditMetadata 
{ 
    [Required] 
    [StringLength(50)] 
    [Display(ResourceType = typeof(Label), Name = "DocumentNumber")] 
    public string DocumentNumber { get; set; } 
    (etc...) 
} 

任何人都可以指向一個解決方案嗎?我需要標籤本地化數據註釋(因此DisplayAttribute)。

回答

1

認爲你需要編寫自己的顯示名稱解析器進行流暢的驗證(猜測這應該放在你的global.asax中)。

注意

這種解決方案只是試圖解決的顯示名稱

應該不再使用您的其他「驗證」屬性(Required,StringLength),因爲您將使用FluentValidation管理該屬性。

ValidatorOptions.DisplayNameResolver = (type, memberInfo, expression) => 
{ 
     //this will get in this case, "DocumentNumber", the property name. 
     //If we don't find anything in metadata/resource, that what will be displayed in the error message. 
     var displayName = memberInfo.Name; 
     //we try to find a corresponding Metadata type 
     var metadataType = type.GetCustomAttribute<MetadataTypeAttribute>(); 
     if (metadataType != null) 
     { 
      var metadata = metadataType.MetadataClassType; 
      //we try to find a corresponding property in the metadata type 
      var correspondingProperty = metadata.GetProperty(memberInfo.Name); 
      if (correspondingProperty != null) 
      { 
       //we try to find a display attribute for the property in the metadata type 
       var displayAttribute = correspondingProperty.GetCustomAttribute<DisplayAttribute>(); 
       if (displayAttribute != null) 
       { 
        //finally we got it, try to resolve the name ! 
        displayName = displayAttribute.GetName(); 
       } 
      } 
     } 
     return displayName ; 
}; 

來看

個人觀點

順便說一句,如果你只是使用元數據類清晰,不使用它們! 這可能是一個解決方案,如果你沒有選擇(當從EDMX生成實體類,你真的想要這樣管理顯示名稱),但如果沒有必要,我真的會避免它們。

+0

感謝您的有益迴應和意見。它適用於規則,但是當我沒有指定規則(對於不可空值不需要)時,它使用默認解析器。我不能'找到類似的調整 – Hefass

+0

似乎FluentValidationModelValidatorProvider如果需要添加「必需」,但用戶沒有指定他自己(流利)。不幸的是,在FluentValidationPropertyValidator的ctor中,存在創建PropertyRule的默認邏輯,並且它重寫了在PropertyRule ctor中正確設置的DisplayName。我把它看成是一個錯誤。 https://github.com/JeremySkinner/FluentValidation/blob/11e46cba4727f2e7e0a06de51b4d0e4bd92ba341/src/FluentValidation.Mvc3/PropertyValidatorAdapters/FluentValidationPropertyValidator.cs#L30 – Hefass

+0

你的意思是,這個問題是當你把一個空值的非null的屬性?這與FluentValidation無關,但與Mvc的默認模型綁定相關。 –

相關問題