簡體   English   中英

ASP.NET MVC 2.0驗證和錯誤消息

[英]ASP.NET MVC 2.0 Validation and ErrorMessages

我需要在MVC 2.0中設置DataAnnotation的validate屬性的ErrorMessage屬性。 例如,我應該能夠傳遞ID而不是Model屬性的實際錯誤消息,例如...

[StringLength(2, ErrorMessage = "EmailContentID")] 
[DataType(DataType.EmailAddress)]         
public string Email { get; set; } 

然后使用此ID(“ EmailContentID”)從另一個服務(例如數據庫)中檢索某些內容(錯誤消息)。 然后,錯誤錯誤消息將顯示給用戶,而不是ID。 為此,我需要設置DataAnnotation驗證屬性的ErrorMessage屬性。

通過重寫DataAnnotationsModelValidatorProvider的受保護重寫IEnumerable GetValidators(ModelMetadata元數據,ControllerContext上下文,IEnumerable屬性),這似乎是一項艱巨的任務。

但是現在很復雜...

答:MVC DatannotationsModelValidator的ErrorMessage屬性是只讀的。 所以我不能在這里設置任何內容B. System.ComponentModel.DataAnnotationErrorMessage屬性(獲取並設置)已在MVC DatannotationsModelValidator中設置,因此無法再次設置。 如果嘗試設置它,則會出現“該屬性不能設置多次...”錯誤消息。

 public class CustomDataAnnotationProvider : DataAnnotationsModelValidatorProvider 
 { 
      protected override IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata,  ControllerContext context, IEnumerable<Attribute> attributes) 
       { 
            IEnumerable<ModelValidator> validators = base.GetValidators(metadata, context, attributes); 

             foreach (ValidationAttribute validator in validators.OfType<ValidationAttribute>()) 
             { 
                 messageId = validator.ErrorMessage; 
                 validator.ErrorMessage = "Error string from DB And" + messageId ; 
             } 

            //...... 
       } 
  } 

誰能給我正確的方向嗎?

提前致謝。

我個人不會創建一個繼承原始提供程序的新提供程序,但會創建一個繼承ValidationAttribute或StringLengthAttribute的新屬性。

像這樣

public class MyNewValidationAttribute : StringLengthAttribute
{
    public int ErrorMessageId
    {
        set { 
                var myErrorMessageFromDB = ""; //query database and get message.
                this.ErrorMessage = myErrorMessageFromDB;  
            }
    }
}

現在,當您分配屬性時

[StringLength(2, ErrorMessageId = 1 //equals id from database
)] 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM