Предотвратить ModelState.IsValid от проверки прикрепленных объектов?

Есть ли способ переопределить ModelState.IsValid?

Некоторые из объектов, подлежащих проверке, являются просто прикрепленными объектами, поэтому все поля, кроме идентификатора, не подлежат проверке, поскольку объект находится в состоянии Unchanged.

Есть ли способ сделать это?
Кто-нибудь уже сталкивался с этой проблемой?

Обновить

Скажем, у меня есть следующее действие:

[HttpPost]
public ActionResult SaveEntity(MyEntity entity)
{
    var isValid = ModelState.IsValid; //false
}

Поскольку модель проверяет все свойства и все свойства потомков entity, должен быть способ проверить каждую сущность этих потомков, привязана ли она к контексту, и если да, удалить ошибку из ModelState, что-то вроде следующего:

public ActionResult TryValidateDetachedModel(MyEntity entity, DbContext context)
{
    foreach (var ms in ModelState.Where(ms => ms.Value.Errors.Any()).ToArray())            
    // should iterate over something like GetAllEntityTypesMetadata()
    {
        var entity = GetEntityFromMetadata(ms);
        if (context.Entry(entity).State == EntityState.Unchanged)
        {
             ms.Value.Errors.Clear();                
        }
    }
}

Что я пытаюсь сделать в приведенном выше псевдокоде, так это проверить объекты в цепочке проверки, и если один из них прикреплен как Unchanged, пропустить проверку/удалить его ошибки.

Прямо сейчас я должен сделать это жестко закодированным вручную, проверив ModelState.Key, я ищу более общий и эффективный способ.


person Shimmy Weitzhandler    schedule 14.07.2013    source источник
comment
Почему вы привязываетесь к объекту EF, а не к назначенным моделям представления?   -  person LukLed    schedule 14.07.2013
comment
Я использую объекты POCO, так что это не имеет значения.   -  person Shimmy Weitzhandler    schedule 14.07.2013
comment
Очевидно, это имеет значение, потому что с выделенными моделями просмотра у вас не будет этой проблемы.   -  person LukLed    schedule 14.07.2013
comment
Хорошо, предположим, что вы правы. В настоящее время я не могу позволить себе воссоздать модели просмотра для всех моделей в моем домене. Можете ли вы придумать решение, которое включает взаимодействие с предоставленным DbContext, чтобы увидеть, какие сущности присоединены как Unchanged, и пропустить проверку/удаление ошибок для них?   -  person Shimmy Weitzhandler    schedule 14.07.2013
comment
Ok. Я не совсем уверен, о чем вы просите. Как возможно, что сущности присоединяются к DbContext после привязки? Может быть, вы можете написать какого-нибудь короля ModelBinder, который проверяет состояние и игнорирует проверку, когда объект не изменяется, но я не совсем уверен, о чем вы просите.   -  person LukLed    schedule 14.07.2013
comment
Нет. У меня есть другой метод, который автоматически прикрепляет соответствующие связанные FK к контексту.   -  person Shimmy Weitzhandler    schedule 14.07.2013


Ответы (2)


Чтобы сбросить все ошибки, используйте следующий

ModelState.Clear();

С уважением

person tratatun    schedule 08.08.2013

Вот что я делаю, чтобы проверка применялась только к текущему объекту:

        foreach (var key in ModelState.Keys)
            if (key.Split('.').Length > 2)
                ModelState[key].Errors.Clear();

        if (!ModelState.IsValid)
            return BadRequest(ModelState);

Проверка появления . означает: если ключ modelstate похож на currentDTO.relatedDTO.field, то эта ошибка проверки игнорируется (сбрасывается). Если это просто id или currentDTO.validateThisField, то он не очищается.

person Sean    schedule 13.07.2016