0

В других свойствах одного и того же объекта модели доступны одна информация о свойствах/правилах проверки модели. Я должен проверять значения свойств, используя другие значения свойств.Добавить правило проверки для динамического моделирования свойства в asp.net mvc2

Модель класса: -

[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 
    } 

объект Модель выглядит как above.Here я должен проверить Value свойство с помощью

  • Формат (Fomart Validation как электронная почта, телефон & Дата)

  • MinLength, MaxLength (Диапазон проверки).

Я знаю, что мы можем сделать это с помощью пользовательских валидаций как

  1. Создать пользовательский класс по поддержанию ValidationAttribute в качестве основы
  2. Pass все эти свойства (значение, формат, MinLength & MaxLength)
  3. Запишите корпус переключателя с свойством Format.
  4. Подтвердить формат с помощью Regex и выполнить ручную проверку диапазона или с динамической проверкой Regex.

EDIT: - Добавлена ​​проверка на заказ Код класса Здесь

Пользовательские проверки Класс:

[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. Проверка диапазона должна произойти.

Может ли кто-нибудь представить некоторые мысли вокруг них?

ответ

0

Вы можете использовать IValidatableObject interface. При правильной реализации вы можете отображать уровни свойств и настраиваемые сообщения об ошибках.

Вот question для дальнейшего чтения

+0

спасибо за ур ответ. Можете ли вы предоставить аналогичные примеры, как изменить приведенный выше код? –

+0

Извините, на данный момент у меня нет времени: (Вы прочитали ссылку с похожими вопросами и объяснениями? – archil

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; 
     } 

    } 

Validation адаптер Класс: -

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)); 
     }