IValidatableObject только в некоторых действиях

У меня есть модель, реализующая IValidatlableObject, и поэтому пользовательская проверка ошибок с помощью метода Validate.

Когда я создаю объект, все в порядке, но когда я пытаюсь отредактировать этот объект, я не хочу выполнять эту пользовательскую проверку.

Как я могу узнать, из какого действия я вызываю метод Validate, чтобы не выполнять проверку?

ОБНОВЛЕНО: Это модель mi:

public class Ingredient : IValidatableObject
{
    public int Id { get; set; }

    [Required(ErrorMessage = "Required!!")]
    public string Name { get; set; }

    public virtual List<Product> Products { get; set; }

    public Ingredient()
    {
        Products = new List<Product>();
    }

public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        using (var uow = new UnitOfWork())
        {
            var ingredient = uow.IngredientRepository.Get(i => i.Name ==Name).FirstOrDefault();

            if (ingredient != null)
                yield return new ValidationResult("Duplicate!!!.", new[] { "Name" });
        }


    }
}

}

Итак, когда я создаю ингредиент, я хочу проверить ВСЕ (атрибуты + IValidatable), но когда я редактирую ингредиент, я хочу проверить только атрибуты (поэтому я имею в виду пропустить IValidatable). Любой метод, который нужно знать, внутри метода IValidatable, откуда я вызов Подтвердить?

Спасибо!!!


person Tekno    schedule 12.03.2012    source источник


Ответы (3)


Проверьте первичный ключ модели - не является ли он нулевым :)

person Aleksej Vasinov    schedule 12.03.2012
comment
Я не думал об этом, но да, это может быть хорошим решением !!!. Поэтому я думаю, что нет способа узнать действие/контроллер внутри метода Validate. - person Tekno; 13.03.2012

Более правильный способ "MVCish" здесь состоит в том, что у вас на самом деле есть два класса: один для метода Create, один для редактирования. Вы можете обратиться к базовому классу для любой общей проверки, все, что не является общим, здесь не будет проверяться.

person Adam Tuliper - MSFT    schedule 12.03.2012
comment
Но это будет немного некрасиво! Два одинаковых класса только для проверки. Не много DRY и не manteinable. Я думаю, что это время, когда вам нужно выбирать между чистым MVC или менее MVC, но проще в обслуживании. - person Tekno; 13.03.2012
comment
Это не нарушает DRY. DRY применяется к дублированию логики, а не к моделям представления. Это стандарт MVC. Если вы так обеспокоены этим в модели представления, то оба наследуют от одного источника для общих реквизитов, что вы действительно сохраняете здесь - методы создания и редактирования служат двум отдельным целям, и вы обнаружите, что чем сложнее приложение получает более отдельное представление модели могут помочь. - person Adam Tuliper - MSFT; 14.03.2012

Если вы не хотите проверять объект, не вызывайте Model.IsValid (или Validate(), если вы делаете это явно. Невозможно ответить на большее, не зная более подробной информации о вашей проблеме.

person bhamlin    schedule 12.03.2012