Asp.net mvc 带有IValidatableObject的MVC3对象-每个TryUpdateModel()多次验证激发
我有一个从T4生成的对象类,有一个部分SafeClass进行验证,如下所示: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
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" }));
}