我有一个ASP.NET 4.5 webforms网站,我试图使用所有新的花哨功能,如模型绑定和不显眼的验证。
这很有效 - 只要我在单个字段上验证 - 例如确保输入某些值等。
但是,当我尝试使用IValidatableObject
界面建立跨多个字段的验证时,我无法获得预期的结果。
想象一下,我从SQL Server数据库生成了MyUser
类到EF 6.1代码优先模型。我通过向它添加一个实现IValidatableObject
接口的部分类来扩展这个类:
public partial class MyUser : IValidatableObject
{
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) {
List<ValidationResult> errors = new List<ValidationResult>();
if(UserName.Equals(Password, StringComparison.CurrentCultureIgnoreCase))
{
errors.Add(new ValidationResult("User name and password cannot be the same"));
}
return errors;
}
}
基本上我想检查用户名和密码是否相同 - 我不能仅仅在模型类本身上这样做,因此我在这里做。
现在,在我的Update
(或Insert
)方法中,我想检查用户在网络表单上输入的数据是否有效:
public void Update(int userId)
{
MyUser existing = _repo.GetUserById(userId);
if (existing == null)
{
// handle error
}
TryUpdateModel(existing);
if (ModelState.IsValid)
{
// save
}
}
我原本希望调用部分Validate
类上的MyUser
方法来检查模型状态是否有效 - 但似乎不会发生...... < / p>
我错过了什么?你还会如何实现这样的跨领域验证呢?
更新:问题似乎是Validate
接口的IValidatableObject
方法在单独的分部类文件中实现,未被正确识别。任何想法为什么??
只要我将该方法移动到主要的EF生成的MyUser.cs
类,它就可以正常工作了。哪个好 - 直到有一天我需要再次从数据库重新创建我的实体类,当数据库发生变化时......