【问题标题】:Replace default client side validation by custom one in ASP.NET MVC用 ASP.NET MVC 中的自定义验证替换默认客户端验证
【发布时间】:2015-01-01 18:10:48
【问题描述】:

我有一个包含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”被拒绝。

有什么方法可以禁止对数据类型的默认客户端验证,并用自定义的替换它(而不是“添加”自定义的)?

【问题讨论】:

  • 你的monthyeardate怎么样?

标签: asp.net asp.net-mvc validation asp.net-mvc-5 client-side-validation


【解决方案1】:

由于框架不允许您使用某些自定义属性覆盖真实类型,甚至不允许覆盖特定类型的 ModelMetadataProvider,因此您必须注册自己的全局 ModelMetadataProvider,这会使验证器误以为它实际上是string

类似:

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 适配器中,您可以强制删除date 验证(如果您愿意分享您的monthyeardate 代码,我可以提供一个示例)。

MSDN

【讨论】:

  • 谢谢!同时我也想出了你的第二个解决方案:在添加适配器时(使用jQuery.validator.unobtrusive.adapters.add),我在注册码中加入了options.rules['date'] = false;之类的东西。这非常有效。
【解决方案2】:

这很老套,但您可以做的一件简单的事情是添加:

$(function () {
    $.validator.methods.date = function () { return true; }; 
});

这样默认的 data-val-date 在触发您的自定义日期验证时始终返回 true。

【讨论】:

  • 这将禁用页面中所有日期输入的日期验证。
  • 确实如此,我认为这可能不是最好的解决方案。我很想看到更好的解决方案。
  • 这就是我想要的。谢谢。
【解决方案3】:

我知道这有点老了,以防万一有人不考虑它(因为我还不能离开 cmets),为了增强 @AlexC 响应,您可以在该语句中添加验证。

例如,我使用 moment.js 进行日期验证 (moment.js),这允许您添加自己的验证规则。

if (moment(a, "M/YYYY").isValid() || moment(a).isValid())
{
    return true;
}

这将检查它是否是常规日期,在这种情况下,还会检查日期是否为“M/YYYY”格式。如果其中之一为真,则接受验证。

【讨论】:

    猜你喜欢
    • 2014-03-19
    • 1970-01-01
    • 1970-01-01
    • 2013-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-05
    • 2014-11-03
    相关资源
    最近更新 更多