【问题标题】:Prevent ModelState.IsValid from validating attached entities?防止 ModelState.IsValid 验证附加实体?
【发布时间】:2013-07-12 05:37:37
【问题描述】:

有没有办法覆盖ModelState.IsValid

某些要验证的实体只是附加实体,因此除了 ID 之外的所有字段都不会验证,因为实体处于状态 Unchanged

有没有办法做到这一点?
以前有人遇到过这个问题吗?

更新

假设我有以下操作:

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

由于模型验证了 entity 的所有属性和所有后代属性,因此必须有一种方法来检查这些后代的每个实体,它是否附加到上下文中,如果是,则从 @987654325 中删除错误@,类似于以下内容:

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 手动进行硬编码,我正在寻找一种更通用和更有效的方法。

【问题讨论】:

  • 为什么绑定到 EF 对象,而不是指定的视图模型?
  • 我使用的是 POCO 实体,所以没有区别。
  • 显然它会有所不同,因为使用专用视图模型您不会遇到这个问题。
  • 好吧,假设你是对的。目前我无法为我的域中的所有模型重新创建视图模型。您能想出一个解决方案,将与提供的DbContext 进行交互以查看哪些实体附加为Unchanged 并跳过验证/删除它们的错误?
  • 好的。我不太确定你在问什么。实体如何在绑定后附加到 DbContext?也许您可以编写一些ModelBinder 之王,当实体未更改时检查状态并忽略验证,但我不确定您要的是什么。

标签: asp.net-mvc entity-framework controller modelstate modelstatedictionary


【解决方案1】:

要清除所有错误,请使用下一步

ModelState.Clear();

问候

【讨论】:

    【解决方案2】:

    这是我为确保验证仅适用于当前实体所做的工作:

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

    检查. 的出现意味着:如果模型状态键类似于currentDTO.relatedDTO.field,则忽略(清除)该验证错误。如果只是idcurrentDTO.validateThisField,则不会被清除。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-18
      • 2017-08-08
      相关资源
      最近更新 更多