0

Я пытаюсь подключить проверку на стороне сервера, поэтому есть какая-то последняя линия защиты, так что плохие данные не проходят. Одно из моих полей зависит от логического значения. Если логическое значение true, значение int должно быть 0. Если оно ложно, оно должно находиться между 1 и 7. Это то, что у меня есть до сих пор, но оно не работает.Пользовательская проверка на стороне сервера MVC Entity Framework

[ValidApplicationPrimary(ComplianceProfile= NFlagComplianceProfile)] 
[Column("APPLICATION_PRIMARY")] 
public int ApplicationPrimary { get; set; } 

[Required] 
[Column("NFLAG_COMPLIANCE_PROFILE")] 
public bool NFlagComplianceProfile { get; set; } 

public class ValidApplicationPrimary : ValidationAttribute 
    { 
     public Boolean ComplianceProfile { get; set; } 

     public override bool IsValid(object value) 
     { 
      if (ComplianceProfile)//If they have a compliance profile the value of Application Primary should be 0 
      { 
       if (((Int32)value) == 0) 
       { 
        return true; 
       } 
       else 
       { 
        return false; 
       } 
      } 
      else if (((Int32)value) > 0 && ((Int32)value)<=7) //If Application primary is between 1 and 7 then it is true 
      { 
       return true; 
      } 
      else //Outside that range its false 
       return false; 

     } 

Я получаю эту ошибку

Error 3 An object reference is required for the non-static field, method, or property 'EntityFrameworkTable.NFlagComplianceProfile.get' 

ответ

2

Вы не можете ссылаться на другие свойства таким образом. Если у вас есть .NET 4 или выше, вы можете сделать что-то вроде этого:

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)] 
public sealed class ValidApplicationPrimary : ValidationAttribute 
{ 
    private const string DefaultErrorMessage = "If {0} is false, {1} must be 1-7."; 

    public bool ComplianceProfile { get; private set; } 

    public override string FormatErrorMessage(string name) 
    { 
    return string.Format(ErrorMessageString, name, ComplianceProfile); 
    } 

    protected override ValidationResult IsValid(object value, 
         ValidationContext validationContext) 
    { 
    if (value != null) 
    { 
     var complianceProfile= validationContext.ObjectInstance.GetType() 
         .GetProperty(ComplianceProfile); 

     var complianceProfileValue= complianceProfile 
        .GetValue(validationContext.ObjectInstance, null); 

     if (complianceProfileValue)//If they have a compliance profile the value of Application Primary should be 0 
     { 
      if (((Int32)value) == 0) 
      { 
       return ValidationResult.Success; 
      } 
      else 
      { 
       return new ValidationResult(FormatErrorMessage(validationContext.DisplayName)); 
      } 
     } 
     else if (((Int32)value) > 0 && ((Int32)value)<=7) //If Application primary is between 1 and 7 then it is true 
     { 
      return ValidationResult.Success; 
     } 
     else //Outside that range its false 
      return new ValidationResult(FormatErrorMessage(validationContext.DisplayName)); 


    } 

    return ValidationResult.Success; 
    }   
} 

Использование:

[ValidApplicationPrimary("ComplianceProfile")] 
[Column("APPLICATION_PRIMARY")] 
public int ApplicationPrimary { get; set; } 

В данной статье описывается это в деталях: http://www.devtrends.co.uk/blog/the-complete-guide-to-validation-in-asp.net-mvc-3-part-2

+0

Это выглядит интересно, и мне, возможно, придется попробовать это, но я также нашел этот веб-сайт и взял кое-что оттуда для меня. Http://www.binaryintellect.net/articles/55bef03e-3d41-4a0a-b874-78b7c7a9ce36.aspx, который я опубликую в качестве ответа, чтобы другие могли видеть. –

+0

Глядя на два ответа, похоже, они используют примерно ту же концепцию –

+0

Да, похоже. Обратите внимание, что статья devtrends также показывает, как вы можете добиться проверки на стороне клиента. –

1

Если вы еще не сделали, вы должны рассмотреть вопрос об использовании FluentValidation Джереми Скиннера. Очень легкий и значительно упростит ваши правила валидации.

FluentValidation github

После того, как вы ваш первоначальный набор и модель украшена, вы бы разместить свои правила в конструкторе вашего валидатора. Вы даже можете определить собственные методы проверки для условного применения правил проверки. Это объясняется более подробно в документах.

public class ObjectValidator : AbstractValidator<YourObject> 
{  
    public ObjectValidator(){ 
     RuleFor(x => x.ApplicationPrimary).Equal(0).When(x => x.NFlagComplianceProfile); 
     RuleFor(x => x.ApplicationPrimary).InclusiveBetween(1, 7).When(x => !x.NFlagComplianceProfile);  
    } 
} 

Вы бы украсить вашу модель как этот

[Validator(typeof(ObjectValidator))] 
public class YourObject 
{ 
    public int ApplicationPrimary { get; set; } 

    public bool NFlagComplianceProfile { get; set; } 
} 
+0

Просьба привести пример, как он может достичь этого с помощью FluentValidation. –

+0

Добавлен простой пример. Я обязательно включу примеры во все мои будущие ответы. Благодарю. – JDupont

0
public class ValidApplicationPrimary : ValidationAttribute 
    { 
     protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
     { 
      Boolean flag = false; 
      Object instance = validationContext.ObjectInstance; 
      Type type = instance.GetType(); 
      PropertyInfo property = type.GetProperty("NFlagComplianceProfile"); 
      Object propertyValue = property.GetValue(instance); 

      switch (Convert.ToInt32(propertyValue)) 
      { 
       case 1: 
        if(Convert.ToInt32(value) == 0) 
        { 
         flag = true; 
        } 
        break; 
       case 0: 
        if(Convert.ToInt32(value) >0 && Convert.ToInt32(value)<8) 
        { 
         flag = true; 
        } 
        break; 
       default: 
        flag = false; 
        break; 
      } 
      if(!flag) 
      { 
       ValidationResult result = new ValidationResult(""); 
       return result; 
      } 
      else 
      { 
       return null; 
      } 


     } 

http://www.binaryintellect.net/articles/55bef03e-3d41-4a0a-b874-78b7c7a9ce36.aspx

Кажется, это работает для меня. Есть несколько перегибов, но несколько разных сценариев, которые я пытался, выглядели правильно.

 Смежные вопросы

  • Нет связанных вопросов^_^