ASP.NET 4.5 - 不显眼的验证,模型绑定,IValidatableObject接口

时间:2015-05-11 12:30:21

标签: data-binding webforms unobtrusive-validation asp.net-4.5

我有一个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类,它就可以正常工作了。哪个好 - 直到有一天我需要再次从数据库重新创建我的实体类,当数据库发生变化时......

0 个答案:

没有答案