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

在ASP.NET MVC中使用自定义验证替换默认客户端验证

发布时间:2020-12-16 06:38:43 所属栏目:asp.Net 来源:网络整理
导读:我有一个包含DateTime属性的视图模型,我想使用自定义格式(仅限月份和年份,“MM.YYYY”)为其提供文本框: public class MyModel { public DateTime? DateField {get; set;}} 格式化TextBox的值很简单(使用格式字符串).我还实现了一个自定义模型绑定器来进行转
我有一个包含DateTime属性的视图模型,我想使用自定义格式(仅限月份和年份,“MM.YYYY”)为其提供文本框:

public class MyModel {
  public DateTime? DateField {get; set;}
}

格式化TextBox的值很简单(使用格式字符串).我还实现了一个自定义模型绑定器来进行转换,这很好.

我仍然遇到客户端验证问题:我可以实现从ValidationAttribute派生的自定义验证器,它实现IClientValidatable并设置相应的jquery.validate适配器等.

但是MVC仍然将“默认”验证属性data-val-date(除了我的自定义验证属性data-val-monthyeardate)添加到输入字段,因此默认检查仍然适用,输入“MM.YYYY”被拒绝.

有没有办法抑制数据类型的默认客户端验证并将其替换为自定义(而不是“添加”自定义的)?

解决方法

由于框架不允许您使用某些自定义属性覆盖实际类型,甚至覆盖特定类型的ModelMetadataProvider,因此您必须注册自己的全局ModelMetadataProvider,欺骗验证器认为它实际上是一个字符串.

就像是:

public class MyModelMetadataProvider : DataAnnotationsModelMetadataProvider
{
    protected override ModelMetadata CreateMetadata(IEnumerable<Attribute> attributes,Type containerType,Func<object> modelAccessor,Type modelType,string propertyName)
    {
        if (attributes.OfType<ExcludeCharAttribute>().Any())
            modelType = typeof (String);

        return base.CreateMetadata(attributes,containerType,modelAccessor,modelType,propertyName); ;
    }
}

注册使用:

ModelMetadataProviders.Current = new MyModelMetadataProvider();

尽管如此,由于核心问题是客户端问题,我将纯粹使用客户端代码处理它.在您的monthyeardate适配器中,您可以强制删除日期验证(如果您将共享月份代码,我可以提供一个示例).

见MSDN

(编辑:李大同)

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

    推荐文章
      热点阅读