2012-10-21 24 views
1

我有一個要求,以將StringLengthAttribute驗證添加到現有的ASP.NET MVC 4項目中的很多模型,並試圖通過我自己的模型元數據提供程序從DataAnnotationsModelMetadataProvider派生自動執行此操作。通過自定義DataAnnotationsModelMetadataProvider添加StringLengthAttribute

它與RequiredAttribute和一些其他數據註釋屬性(我得到客戶端和服務器端驗證工作)完美的工作,但不添加字符串長度的驗證 - 找到下面的最小示例。

public class CustomModelMetadataProvider : DataAnnotationsModelMetadataProvider 
{ 
    protected override ModelMetadata CreateMetadata(IEnumerable<Attribute> attributes, 
                Type containerType, 
                Func<object> modelAccessor, 
                Type modelType, 
                string propertyName) 
    { 
     StringLengthAttribute lengthAttribute = new StringLengthAttribute(256); 
     attributes = attributes.Union(new[] { lengthAttribute }); 
     return base.CreateMetadata(attributes, 
            containerType, 
            modelAccessor, 
            modelType, 
            propertyName); 
    } 
} 

因此,看起來像StringLengthAttribute它以某種特殊的方式處理。關於如何使其工作或更好的實施想法的任何想法?

回答

1

玩過後,我無法獲得StringLength屬性。

不理想,但我想一個替代解決方案是使用全局ModelValidatorProvider類。當然,你不會得到由StringLengthAttribute提供的內置Javascript,你會編寫自己的邏輯,但是它可以快速修復以後可以解決的問題嗎?

public class MyCustomModelValidatorProvider : ModelValidatorProvider 
{ 
    public override IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, ControllerContext context) 
    { 
     return new List<ModelValidator>() { new MyCustomModelValidator(metadata, context) }; 
    } 

    public class MyCustomModelValidator : ModelValidator 
    { 
     public MyCustomModelValidator(ModelMetadata metadata, ControllerContext context) 
      : base(metadata, context) 
     { } 

     public override IEnumerable<ModelValidationResult> Validate(object container) 
     { 
      var model = this.Metadata.Model; 
      if (model is string) 
      { 
       var value = model as string; 

       if (String.IsNullOrEmpty(value) || value.Length > 256) 
       { 
        var validationResult = new ModelValidationResult(); 
        validationResult.Message = (this.Metadata.DisplayName ?? this.Metadata.PropertyName) 
         + " needs to be no more then 256 characters"; 

        return new List<ModelValidationResult>() { validationResult }; 
       } 
      } 

      return new List<ModelValidationResult>(); 
     } 
    } 

} 

添加MyCustomModelValidator集合中的Global.asax

 protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 

     // Use LocalDB for Entity Framework by default 
     Database.DefaultConnectionFactory = new SqlConnectionFactory(@"Data Source=(localdb)\v11.0; Integrated Security=True; MultipleActiveResultSets=True"); 

     RegisterGlobalFilters(GlobalFilters.Filters); 
     RegisterRoutes(RouteTable.Routes); 


     ModelValidatorProviders.Providers.Add(new MyCustomModelValidatorProvider()); 
    } 
+0

我想我會採取這種做法現在,謝謝! –

相關問題