我在.Net Core项目中使用aspnetboilerplate框架。我在official documentation之后对视图模型进行了自定义验证。
首先,我有一个带有自定义验证的简单视图模型:
public String get_value(long nodeid,String ts) {
try {
String sql="Select URL FROM urllink WHERE URL='f0="+nodeid+"&ts="+ts + "'";
if (em == null) {
throw new Exception("could not found URL object.");
}
em.createNativeQuery(sql).getSingleResult();
return (String)em.createNativeQuery(sql).getSingleResult();
// return 1;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
然后我的控制器是这样的:
public class EditPropertyViewModel : ICustomValidate
{
public long Id { get; set; }
public long? ParentId { get; set; }
public string Title { get; set; }
public void AddValidationErrors(CustomValidationContext context)
{
if (Id == ParentId)
context.Results.Add(new ValidationResult("Property cannot be parent of itself!", new [] { "ParentId" } ));
}
}
但是当我运行项目时,会发生此异常:
AbpValidationException:方法参数无效!有关详细信息,请参见ValidationErrors。
这意味着我的自定义验证已在ModelState.IsValid之前执行,并且没有机会处理该异常并向用户显示用户友好的消息。通过[DisableValidation]禁用验证会跳过此异常,但我的验证逻辑也会被跳过。我还尝试使用.NET的标准IValidatableObject接口代替abp的ICustomValidate,但这没有帮助我解决问题。