Asp.net mvc 带有IValidatableObject的MVC3对象-每个TryUpdateModel()多次验证激发

Asp.net mvc 带有IValidatableObject的MVC3对象-每个TryUpdateModel()多次验证激发,asp.net-mvc,Asp.net Mvc,我有一个从T4生成的对象类,有一个部分SafeClass进行验证,如下所示: public partial class Address : IValidatableObject 此类具有如下验证方法: public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) { //ValidationResponse is a custom struct that holds a

我有一个从T4生成的对象类,有一个部分SafeClass进行验证,如下所示:

public partial class Address : IValidatableObject
此类具有如下验证方法:

public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
    //ValidationResponse is a custom struct that holds a few properties.
    ValidationResponse r = this.IsValidAddress(); //a method that does some checks

    if (!r.IsValid)
    {
        yield return new ValidationResult(r.Message, new string[] { "Address1" });
    }
}
请注意,Policy对象包含一个Person对象,其中包含一个Address对象(所有3个对象的片段都在同一个视图中呈现;可能相关,我不知道)

执行TryUpdateModel()时,将调用地址的Validate方法3次。我验证了它不会触发该策略上的其他地址。我还验证了控制器的HttpPost方法只被调用一次。TryUpdateModel()的一次执行触发了3次验证


还有谁碰到过这种事吗?有什么问题吗?

我在运行这段代码时遇到过类似的问题

        if (isPoorSpecimen)
        {

            errors.Add(new ValidationResult("Your are reporting poor specimen condition, please specify what is the reason"
                , new string[] { "SpecimenCondition", "QtyOk", "DocumentedOk", "ColdChainOk", "PackagingOK", "IsProcessable" }));
        }
它将在Html.ValidationSummary()中显示错误消息6次。 解决方案是对每个错误使用一个单独的控件

        if (isPoorSpecimen)
        {

            errors.Add(new ValidationResult("Your are reporting poor specimen condition, please specify what is the reason"
                , new string[] { "SpecimenCondition" }));
        }

调用它3次,因为
地址
实例首先验证为独立实体,然后验证为独立
个人
实体的成员,最后验证为作为
策略
实体成员的
个人
实体的成员

我建议采取以下解决办法:

1) 从所有类中删除
IValidatableObject
,但不包括
Policy
,并手动验证其成员:

公共类策略:IValidatableObject
{
公共人物实例{get;set;}
公共IEnumerable验证(ValidationContext ValidationContext)
{
//验证策略。。。
//然后显式验证成员
var结果=PersonInstance.Validate(validationContext);
}
}
公共阶层人士
{
公共地址AddressInstance{get;set;}
公共IEnumerable验证(ValidationContext ValidationContext)
{
//验证人。。。
//然后显式验证成员
var results=AddressInstance.Validate(validationContext);
}
}
公共课堂演讲
{
公共IEnumerable验证(ValidationContext ValidationContext)
{
//验证地址。。。
}
}
2) 或者为每个类添加一个标志以仅验证一次,因为调用中的实例是相同的:

private bool validated=false;
公共IEnumerable验证(ValidationContext ValidationContext)
{
如果(!已验证)
{
已验证=正确;
//验证
}
}

希望这有帮助。

在我的例子中,它只显示一次(我没有使用ValidationSummary),但代码正在重复执行。
        if (isPoorSpecimen)
        {

            errors.Add(new ValidationResult("Your are reporting poor specimen condition, please specify what is the reason"
                , new string[] { "SpecimenCondition" }));
        }