• MVC ValidationAttribute 验证一个字段必须大于另一个字段


    [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter)]
        public class MinFieldAttribute : BaseCompareAttribute
        {
            public string MinValueField { get; set; }
            private string MinDisplayName { get; set; }
    
            public MinFieldAttribute(Type operandType, string minValueField,string minDisplayName) : base(operandType, minValueField, () => LocalizationExtensions.T("Rundong.Infrastructure.MinFieldAttribute.ErrorMsg", "{0}不能小于{1}"))
            {
                MinValueField = minValueField;
                MinDisplayName = minDisplayName;
            }
    
            protected override ValidationResult IsValid(object value, ValidationContext validationContext)
            {
                var minPropertyInfo = validationContext.ObjectType.GetProperty(MinValueField);
                if (minPropertyInfo == null)
                {
                    return new ValidationResult(string.Format(CultureInfo.CurrentCulture, LocalizationExtensions.T("Rundong.Infrastructure.MinFieldAttribute.NotExist", "{0}不存在"), MinValueField));
                }
    
                var minPropertyValue = minPropertyInfo.GetValue(validationContext.ObjectInstance, null);
                var compareValue = (IComparable) value;
                if (value!=null&& compareValue.CompareTo(minPropertyValue)<0)
                {
                    if (MinDisplayName == null)
                    {
                        MinDisplayName = ModelMetadataProviders.Current.GetMetadataForProperty(
                            () => validationContext.ObjectInstance, validationContext.ObjectType, MinValueField).GetDisplayName();
                    }
                    return new ValidationResult(FormatErrorMessage(validationContext.DisplayName));
                }
                return null;
            }
    
    
            public override string FormatErrorMessage(string name)
            {
                return string.Format(ErrorMessageString, name, MinDisplayName??MinValueField);
            }
    
        }
    

      

    public class MinFieldValidationMetadata<TValueType> : ModelValidationMetadata where TValueType : struct
        {
            public string MinValueField { get; set; }
            protected override ModelValidator CreateValidatorCore(ExtendedModelMetadata modelMetadata,
                ControllerContext context)
            {
                var type = typeof(TValueType?).GetUnderlyingType();
                var minModelMetadata=  modelMetadata.Properties.FirstOrDefault(a => a.PropertyName == MinValueField);
                var minDisplayName = minModelMetadata!=null ? minModelMetadata.GetDisplayName() : ModelMetadataProviders.Current.GetMetadataForProperty(() => null, modelMetadata.ContainerType, MinValueField).GetDisplayName();
                var attribute = new MinFieldAttribute(type, MinValueField, minDisplayName);
                return new BaseCompareAttributeAdapter(modelMetadata, context, attribute){MinValueField = MinValueField };
            }
        }
    

      通过重写IsValid方向添加自定义验证,MinValueField为需要比较的字段名,MinDisplayName是显示的名字。BaseCompareAttribute记录的构造函数第三个参数为重写FormatErrorMessage函数,以及提供比较值的类型转换

    具体是参考微软两个字段比较是否相同https://github.com/aspnet/AspNetWebStack/blob/master/src/System.Web.Mvc/CompareAttribute.cs

  • 相关阅读:
    各个download文件说明
    网页中播放FLV文件的代码
    关于外部样式表中backgroundimage:url()的设置
    C# VS 2010创建、安装、调试 windows服务(windows service)
    HttpUtility.UrlEncode,Server.UrlEncode 的区别
    关于Coolite(EXT)问题之一
    Trace 日志文件
    document对象
    让IE6/IE7/IE8浏览器支持CSS3属性特效
    自定义URL Protocol Handler 呼出应用程序
  • 原文地址:https://www.cnblogs.com/Cyril-hcj/p/11697871.html
Copyright © 2020-2023  润新知