gpt4 book ai didi

asp.net-mvc-3 - 自定义正则表达式属性缺少用于客户端验证的 data-val-regex-pattern

转载 作者:行者123 更新时间:2023-12-01 23:31:48 27 4
gpt4 key购买 nike

我创建了以下自定义正则表达式属性

[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)]
public class AlphaNumericAttribute: RegularExpressionAttribute, IClientValidatable
{
public AlphaNumericAttribute()
: base("^[-A-Za-z0-9]+$")
{
}

public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
yield return new ModelClientValidationRule { ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()), ValidationType = "alphanumeric" };
}
}

ViewModel 中的字段用我的 AlphaNumeric 属性装饰:

[AlphaNumeric(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = Resources.DriverLicenseNumber_RegexError_)]
public string DriverLicenseNumber { get; set; }

该字段构建在 View 中:

@using (Html.BeginForm("Index", "Application", FormMethod.Post, new { id = "applicationDataForm", autocomplete = "off" }))
{
@Html.LabelFor(m => m.DriverLicenseNumber)
@Html.ValidationMessageFor(m => m.DriverLicenseNumber)
@Html.TextBoxFor(m => m.DriverLicenseNumber)
}

这应该在我的 html 输入标记上产生正确的“data-”验证属性。但是,呈现的标签如下所示:

<input data-val="true" data-val-alphanumeric="Please enter a valid driver's license number." id="DriverLicenseNumber" name="DriverLicenseNumber" type="text" value="" maxlength="20" class="valid">

明显缺少应该呈现的 data-val-regexdata-val-regex-pattern 属性。

我已经构建了具有完全相同结构的其他验证器,并且它们工作正常,例如这个 SSN 验证,它使用 jquery 掩码处理掩码输入的掩码空间:

public class SsnAttribute : RegularExpressionAttribute, IClientValidatable
{
public SsnAttribute()
: base("^([0-9]{3}–[0-9]{2}–[0-9]{4})|([ ]{3}–[ ]{2}–[ ]{4})|([0-9]{9,9})$")
{
}

public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
yield return new ModelClientValidationRule { ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()), ValidationType = "ssn" };
}

}

使用 ViewModel 上的随附应用程序:

[Ssn(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = Resources.SocialSecurity_RegexError_)]
public new string SocialSecurityNumber { get; set; }

该字段构建在 View 中:

@using (Html.BeginForm("Index", "Application", FormMethod.Post, new { id = "applicationDataForm", autocomplete = "off" }))
{
@Html.LabelFor(m => m.SocialSecurityNumber)
@Html.ValidationMessageFor(m => m.SocialSecurityNumber)
@Html.TextBoxFor(m => m.SocialSecurityNumber)
}

此验证属性正确呈现 data-val-regex 和 data-val-regex-pattern 属性:

<input class="SSNMask valid" data-val="true" data-val-regex="Please enter a valid social security number." data-val-regex-pattern="^([0-9]{3}–[0-9]{2}–[0-9]{4})|([ ]{3}–[ ]{2}–[ ]{4})|([0-9]{9,9})$" id="SocialSecurityNumber" name="SocialSecurityNumber" type="text" value="" maxlength="22">



我无法弄清楚 AlphaNumeric 属性缺少什么,它没有呈现适当的 html 属性。

最佳答案

我认为,在 AlphaNumericAttribute 情况下,您的问题是您没有为 alphanumeric 类型的验证器添加 JavaScript 适配器。

你的代码中肯定有这样的东西:

$.validator.unobtrusive.adapters.add('ssn', function(options) { /*...*/ });

上面的代码声明了SsnAttribute的客户端适配器。请注意,它的名称 ssnModelClientValidationRuleValidationType 属性中设置的名称相同。

要解决 AlphaNumericAttribute 的问题,您应该返回 ModelClientValidationRegexRule,因为它已经为您的案例进行了所有必要的设置(即已经存在的适配器 regex )。

[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)]
public class AlphaNumericAttribute : RegularExpressionAttribute, IClientValidatable
{
public AlphaNumericAttribute()
: base("^[-A-Za-z0-9]+$")
{
}

public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
yield return new ModelClientValidationRegexRule(FormatErrorMessage(metadata.GetDisplayName()), Pattern);
}
}

但是,如果客户端在正则表达式验证后面应该有其他逻辑,您应该编写并注册您自己的不显眼的适配器。

为了获得更大的图像并更好地理解如何在 ASP.NET MVC 中实现自定义验证,您可以引用 Brad Wilson 的博客文章 Unobtrusive Client Validation in ASP.NET MVC 3 ,请参阅用于异常验证器的自定义适配器部分。

关于asp.net-mvc-3 - 自定义正则表达式属性缺少用于客户端验证的 data-val-regex-pattern,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17956627/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com