Использование значения модели ASP .NET MVC для проверки другого значения модели? - PullRequest
9 голосов
/ 16 февраля 2011

У меня есть класс модели, подобный этому:

public class SomeClass
{
    public int EmployeeId {get;set;}
    public int DayTotal {get;set}
}

Для этого класса модели я создаю собственный атрибут ValidationAttribute для свойства 'DayTotal'.Пользовательский валидатор проверит введенное значение 'DayTotal' по сравнению с другой таблицей, которая определяет максимально допустимые дни.

Как ссылаться на выбранный 'EmployeeId' в представлении «Создать» при записи моего запроса в валидаторе?

public class DayTotalAttribute : ValidationAttribute
{
    ProjectDBContext db = new ProjectDBContext();

    public override bool IsValid(object value)
    {
        if (value == null)
        {
            return false;
        }

        var products = from p in db.EmployeeDayMax
                       where p.EmployeeId = ???
    }
}

ОБНОВЛЕНИЕ:

Мое решение использует другой подход.Полезные ответы заставили меня искать в других местах.Этот блог от Скотта Гу помог обеспечить более простой подход:

В моей модели ->

   public class SomeClass : IValidateObject
   {
         public int EmployeeId {get; set;}
         public int DayTotal {get; set;}

         public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
         {
            ProjectDBContext db = new ProjectDBContext();
            //check maxes...can refer directly to EmployeeId in LINQ queries
            if(failed)
            {
               yield return new ValidationResult("Days have been maxed!");
            }

Ответы [ 2 ]

7 голосов
/ 16 февраля 2011

@ Люк Беннетт совершенно прав, ValidationContext является новым в MVC 3.

Вот пример использования вашего кода:

public class DayTotalAttribute : ValidationAttribute
{
    ProjectDBContext db = new ProjectDBContext();

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        if (value != null)
        {
            var model = (SomeClass)validationContext.ObjectInstance;
            var products = from p in db.EmployeeDayMax
                       where p.EmployeeId = model.EmployeeId

            bool somethingIsWrong = // do your validation here

            if (somethingIsWrong)
            {
                return ValidationResult("Error Message");
            }
        }

        return base.IsValid(value, validationContext);
    }    
}
3 голосов
/ 16 февраля 2011

В .NET 4.0 есть другая перегрузка для IsValid, которая принимает параметр ValidationContext . У него есть свойство ObjectInstance , которое можно преобразовать в SomeClass, и оно дает вам доступ к другим его свойствам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...