【问题标题】:MVC custom DataAnnotation (RequiredAttribute) not applied on select elementsMVC 自定义 DataAnnotation (RequiredAttribute) 未应用于选择元素
【发布时间】:2013-04-25 11:47:44
【问题描述】:

我创建了一个名为“RequredWhen”的新RequiredAttribute 扩展。

它适用于文本框,但不适用于选择元素。 出于某种原因,那些仅在回发而不是在客户端进行验证。 “必需”下拉菜单在客户端验证得很好,那么为什么“RequiredWhen”属性没有验证失败?

当你添加这个属性时

[Required]

你得到这个标记

<select class="customSelect input-validation-error" data-val="true" data-val-number="The field x must be a number." data-val-range="Please select the correct range" data-val-range-max="5" data-val-range-min="0" data-val-required="The x field is required." id="x" name="x"></select>

添加自定义属性不会发生这种情况。在标记中,选择元素中缺少所有与验证相关的属性(如 data-val 等),但它们应用于输入字段。

我需要做些什么来强制验证对选择元素起作用吗? 此外,我调试时 GetClientValidationRules 不包括这些元素。我确定这是问题的一部分。

我的属性扩展了RequiredAttribute,它适用于选择元素,所以我不确定为什么它们被排除在我的实现之外。有任何想法吗?

这是我在其他元素上运行良好的 javascript。:

    jQuery.validator.unobtrusive.adapters.add('requiredwhenchecked', [ 'otherproperty', 'checkedproperty', 'otherpropertyvalue' ],function (options) {
    // simply pass the options.params here
    options.rules['requiredWhenChecked'] = options.params;
    }
);

jQuery.validator.addMethod('requiredWhenChecked', function (value, element, params) {
    return true;
}, '');

除了“选择”属性之外,还有一些东西可以让这一切正常工作。

我认为我的问题可能与thisthis 的情况有关,它们似乎还没有解决方案


更新 没有解决方案,但有一种解决方法,我找到了here! 祝遇到这个讨厌问题的人好运

【问题讨论】:

  • 请出示您的代码。
  • 由于它们的性质,选择元素除了需要之外不需要进一步验证。您是否编写了任何代码来拦截选择元素上的 RquiredWhen?
  • 当你添加所需的属性时,所有这些东西都会自动添加到选择中。像这样: 这使用 [Required] 属性自动发生。但是,它不会发生在我的扩展上面属性的属性中

标签: jquery asp.net-mvc-3 select validation requiredfieldvalidator


【解决方案1】:

属性类没什么好说的 本身,它扩展了RequiredAttribute并且应该类似地工作, 不应该吗?

不,当然不是。 Required 属性在元数据提供程序中有一个与之关联的对应 RequiredAttributeAdapter。如果您希望客户端验证适用于您的自定义属性,您应该编写一个自定义适配器(通过从 DataAnnotationsModelValidator&lt;RequiredWhen&gt; 派生)或让您的 RequiredWhenAttribute 实现 IClientValidatable 接口。

您可以查看MVC Foolproof Validation 验证框架的源代码,了解它是如何完成的。我写了一个例子here

【讨论】:

  • 它实现了 IClientValidatable 和我创建的另一个类似的属性“RequiredIf”按预期工作。我认为问题出在其他地方......
猜你喜欢
  • 1970-01-01
  • 2015-10-07
  • 1970-01-01
  • 2013-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-01
相关资源
最近更新 更多