加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 自定义数据注释永远不会调用IsValid. (ASP.NET MVC 2 .NET

发布时间:2020-12-15 07:42:53 所属栏目:百科 来源:网络整理
导读:我有一个自定义数据验证属性我创建,以确保用户输入的密码是相同的,但从不调用IsValid. 自定义属性: public class IsSameAsAttribute : ValidationAttribute{ public String TargetProperty { get; set; } private readonly object _typeId = new object();
我有一个自定义数据验证属性我创建,以确保用户输入的密码是相同的,但从不调用IsValid.

自定义属性:

public class IsSameAsAttribute : ValidationAttribute
{
    public String TargetProperty { get; set; }
    private readonly object _typeId = new object();

    public IsSameAsAttribute(string targetProperty)
    {
        TargetProperty = targetProperty;
    }

    public override bool IsValid(object value)
    {
        return false;
        //Type objectType = value.GetType();
        //bool isValid = false;

        //PropertyInfo[] neededProperties =
        //    objectType.GetProperties().Where(propertyInfo => propertyInfo.Name == TargetProperty).ToArray();

        //return isValid;
    }

    public override object TypeId
    {
        get { return _typeId; }
    }
}

它适用的数据模型:

public class RegistrationData
{
    [Required(ErrorMessage = "First Name Required")]
    [StringLength(100,ErrorMessage = "First Name must be 100 characters or less.")]
    public String FirstName { get; set;}

    [Required(ErrorMessage = "Last Name Required")]
    [StringLength(100,ErrorMessage = "Last Name must be 100 characters or less.")]
    public String LastName { get; set; }

    [Required(ErrorMessage = "Email is Required")]
    [StringLength(200,ErrorMessage = "Email must be 200 characters or less.")]
    [RegularExpression(@"w+([-+.']w+)*@w+([-.]w+)*.w+([-.]w+)*",ErrorMessage = "Valid Email Address is required.")]
    public String Email { get; set; }

    [Required(ErrorMessage = "Password is required")]
    public String Password { get; set; }

    [IsSameAs("Password")]
    public String PasswordRepeat { get; set; }

    [Required(ErrorMessage = "Division is required")]
    public String Division { get; set; }

}

控制器从哪里调用:

[HttpPost]
public ActionResult ValidationDemo(RegistrationData model)
{
    if (ModelState.IsValid)
    {
        return Redirect("/");
    }

    return View(model);
}

所有“开箱即用”验证都能正常运行,只是我的自定义验证没有被调用.在进行调试时,我发现它是在调用构造函数时实例化的,但是在IsValid上设置的断点永远不会被命中.

发生了什么,我该如何解决?

UPDATE

好吧,我摆弄了一些,如果我在我的控制器中调用TryUpdateModel(模型),它最终会调用IsValid.所以这对我来说意味着我的自定义属性没有被“注册”任何运行MVC 2中的验证.有没有办法解决这个问题?

[HttpPost]
public ActionResult ValidationDemo(RegistrationData model)
{
    TryValidateModel(model);  // <--- *** Added this line and it "works"

    if (ModelState.IsValid)
    {
        return Redirect("/");
    }

    return View(model);
}

解决方法

我看到与MVC2类似/相同/相关的问题 – 只有在所有属性都正确验证时才会调用类级验证.

因此,多个属性可能会失败,并且所有验证消息都会添加到模型状态(并显示在客户端上).但是类级验证消息不在其中;如果属性通过,则仅调用这些上的IsValid.从可用性的角度来看,这有点令人失望,但它确实有效.

我没有调用TryValidateModel().

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读