0

1 つのモデル プロパティ検証情報/ルールは、同じモデル オブジェクトの他のプロパティで使用できます。他のプロパティ値を使用してプロパティ値を検証する必要があります。

モデルクラス:-

    [FormatValidtion("Value", "Format", "MinLength", "MaxLength", ErrorMessage = "Please enter correct format")]
    public class Sample
    {        
        #region ModelProperties

        public string Id { get; set; }

        [Required(ErrorMessage = "Please Enter Value")]
        public string Value { get; set; }              

        public string Format { get; set; }

        public string MinLength { get; set; }

        public string MaxLength { get; set; }

        #endregion
    }

モデル オブジェクトは上記のようになります。ここでは、 Valueプロパティを使用して検証する必要があります。

  • 形式(メール、電話、日付などの形式検証)

  • MinLength、MaxLength (範囲検証) プロパティ。

次のようなカスタム検証を使用してこれを行うことができることを私は知っています

  1. ValidationAttributeをベースとして保持するカスタム クラスを作成します。
  2. これらすべてのプロパティを渡します ( Value 、Format、MinLength & MaxLength)
  3. Format プロパティでスイッチ ケースを記述します。
  4. 正規表現を使用して形式を検証し、手動範囲検証または動的正規表現検証を行います。

編集:-ここにカスタム検証クラスコードを追加しました

カスタム検証クラス:

[AttributeUsage(AttributeTargets.Class)]
public class FormatValidtion : ValidationAttribute
{

    public String Value { get; set; }
    public String Format { get; set; }
    public String MinLength { get; set; }
    public String MaxLength { get; set; }

    public FormatValidtion(String value, String format, String minLength, String maxLength)
    {
        Value = value;
        Format = format;
        MinLength = minLength;
        MaxLength = maxLength;
    }

    public override Boolean IsValid(Object value)
    {
        Type objectType = value.GetType();

        PropertyInfo[] neededProperties =
          objectType.GetProperties()
          .Where(p => p.Name == Value || p.Name == Format || p.Name == MinLength || p.Name == MaxLength)
          .ToArray();

        if (neededProperties.Count() != 4)
        {
            throw new ApplicationException("PropertiesMatchAttribute error on " + objectType.Name);
        }

        Boolean isMatched = true;

        switch (Convert.ToString(neededProperties[1].GetValue(value, null)))
        {
            case "Alpha":
                Regex regExAlpha = new Regex(@"/^[A-Za-z]+$/");
                if (!regExAlpha.IsMatch(Convert.ToString(neededProperties[0].GetValue(value, null))))
                {
                    isMatched = false;
                }
                break;
            case "Number":
                Regex regExNumber = new Regex(@"/^[0-9]+$/");
                if (!regExNumber.IsMatch(Convert.ToString(neededProperties[0].GetValue(value, null))))
                {
                    isMatched = false;
                }
                break;
            case "AlphaNum":
                Regex regExAlphaNum = new Regex(@"/^[a-zA-Z][a-zA-Z0-9]+$/");
                if (!regExAlphaNum.IsMatch(Convert.ToString(neededProperties[0].GetValue(value, null))))
                {
                    isMatched = false;
                }
                break;
            default:
                isMatched = false;
                break;
        }
        return isMatched;
    }    
}

これはクラス レベルで正しく機能し、検証の概要を通じて検証メッセージを表示します。しかし、上記のコードを変更して、次のことを行いたいと考えています。

  1. 検証はプロパティ レベルで行うか、プロパティ レベルでエラー メッセージを表示する必要があります (validationMessage ヘルパー クラスを使用)。
  2. 一般的なエラー メッセージ以外に、検証ごとに特定のエラー メッセージを提供する必要があります。
  3. 範囲の検証が行われる必要があります。

誰かがこれらについていくつかの考えを提供できますか?

4

2 に答える 2

0

次のコードで完了しました。

モデルクラス:-

    [FormatValidtion("Value", "Format", "MinLength", "MaxLength")]
    public class Sample
    {
        #region ModelProperties

        public string Id { get; set; }

        [Required(ErrorMessage = "Please Enter Value")]
        public string Value { get; set; }

        public string Format { get; set; }

        public string MinLength { get; set; }

        public string MaxLength { get; set; }

        #endregion
    }

カスタム検証クラス:-

[AttributeUsage(AttributeTargets.Class)]
    public class FormatValidtion : ValidationAttribute
    {

        public string Value { get; set; }
        public string Format { get; set; }
        public string MinLength { get; set; }
        public string MaxLength { get; set; }
        public string Format1 { get; set; }
        public string Value1 { get { return Value; } }

        public FormatValidtion(String value, String format, String minLength, String maxLength)
        {
            Value = value;
            Format = format;
            MinLength = minLength;
            MaxLength = maxLength;
        }

        public override Boolean IsValid(Object value)
        {
            Type objectType = value.GetType();

            PropertyInfo[] neededProperties =
              objectType.GetProperties()
              .Where(p => p.Name == Value || p.Name == Format || p.Name == MinLength || p.Name == MaxLength)
              .ToArray();

            if (neededProperties.Count() != 4)
            {
                throw new ApplicationException("PropertiesMatchAttribute error on " + objectType.Name);
            }

            Boolean isMatched = true;
            this.Format1 = Convert.ToString(neededProperties[1].GetValue(value, null));

            switch (Convert.ToString(neededProperties[1].GetValue(value, null)))
            {
                case "Alpha":
                    Regex regExAlpha = new Regex(@"/^[A-Za-z]+$/");
                    if (!regExAlpha.IsMatch(Convert.ToString(neededProperties[0].GetValue(value, null))))
                    {
                        isMatched = IsValidLength(Convert.ToString(neededProperties[0].GetValue(value, null)).Length, Convert.ToInt32(neededProperties[2].GetValue(value, null)), Convert.ToInt32(neededProperties[3].GetValue(value, null)));
                    }
                    break;
                case "Number":
                    Regex regExNumber = new Regex(@"/^[0-9]+$/");
                    if (!regExNumber.IsMatch(Convert.ToString(neededProperties[0].GetValue(value, null))))
                    {
                        isMatched = IsValidLength(Convert.ToString(neededProperties[0].GetValue(value, null)).Length, Convert.ToInt32(neededProperties[2].GetValue(value, null)), Convert.ToInt32(neededProperties[3].GetValue(value, null)));
                    }
                    break;
                case "AlphaNum":
                    Regex regExAlphaNum = new Regex(@"/^[a-zA-Z][a-zA-Z0-9]+$/");
                    if (!regExAlphaNum.IsMatch(Convert.ToString(neededProperties[0].GetValue(value, null))))
                    {
                        isMatched = IsValidLength(Convert.ToString(neededProperties[0].GetValue(value, null)).Length, Convert.ToInt32(neededProperties[2].GetValue(value, null)), Convert.ToInt32(neededProperties[3].GetValue(value, null)));
                    }
                    break;
                default:
                    isMatched = false;
                    break;
            }
            return isMatched;
        }

        /// range validation
        public bool IsValidLength(int valueLenght, int minLenght, int maxLenght)
        {
            if (valueLenght >= minLenght && valueLenght <= maxLenght)
                return true;
            return false;
        }

    }

検証アダプター クラス:-

public class FormatValidtionAdapter : DataAnnotationsModelValidator<FormatValidtion>
    {

        public FormatValidtionAdapter(ModelMetadata metadata, ControllerContext context, FormatValidtion attribute)
            : base(metadata, context, attribute)
        {
        }


       // To Provide Error messages dynamically depends on format.            
        public override IEnumerable<ModelValidationResult> Validate(object container)
        {
            string ErrorMessage = null;
            if (!Attribute.IsValid(Metadata.Model))
            {
                switch (Attribute.Format1)
                {
                    case "Alpha":
                        ErrorMessage = "Please enter alphabets only";
                        break;
                    case "Number":
                        ErrorMessage = "Please enter numbers only";
                        break;
                    case "AlphaNum":
                        ErrorMessage = "Please enter alphanumeric  only";
                        break;
                    default:
                        break;
                }
                yield return new ModelValidationResult
                {
                    Message = ErrorMessage,
                    MemberName = Attribute.Value1
                };
            }
        }
    }

Global.aspx.cs:-

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

            RegisterRoutes(RouteTable.Routes);

            DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(FormatValidtion), typeof(FormatValidtionAdapter));
        }
于 2013-10-04T10:57:05.423 に答える