我有一个带有输入字段的MVC视图,该字段对正则表达式进行了验证,类似于 ^ XY [a-zA-Z0-9] {20} $
和我的Html字段看起来像
@Html.TextBoxFor(t => t.Someclass.Name, new
{
data_val = "true",
data_val_required = "Test Required Message",
data_val_regex = "Test Invalid Regex Message",
data_val_regex_pattern = "^XY[a-zA-Z0-9]{20}$",
})
我有两个场景
当用户输入无效的XY12345678901235时,我们会显示" Test Required Message"
如何实现方案2?
谢谢
答案 0 :(得分:2)
您将无法使用不显眼的客户端验证(使用jquery.validate.js和jquery.validate.unobtrusive.js)来执行此操作,因为它只允许每个规则一条消息。相反,您可以通过编写自己的脚本来模拟行为,以类似的方式处理此问题。
有些人不清楚为什么在自动添加这些data-val-*
属性时手动添加这些属性是您将[Required]
和[RegularExpression]
属性应用于您的媒体资源。首先将[Required]
属性包含在您的媒体资源中,以便以默认方式处理
[Required(ErrorMessage = "...")]
public string Name { get; set; }
并在视图中
@Html.TextBoxFor(m => m.Someclass.Name)
@Html.ValidationMessageFor(m => m.Someclass.Name) // for the [Required] error message
<span id="regexerror" class="field-validation-error"></span> // for the custom message
并包含以下脚本来处理文本框.change()
事件以测试值(如果适用,则显示相应的消息)和表单提交事件以取消提交(如果无效)。
var isValid = true;
var regex = /^XY[a-zA-Z0-9]{20}$/;
var prefix = 'XY';
var errorMessage = $('#regexerror');
$('#Someclass_Name').change(function() {
var name = $(this).val();
if (!name) { // no value so let client side validation handle it
return;
}
// test if we match the regex
isValid = regex.test(name);
if (isValid) {
errorMessage.text(''); // clear error
} else {
if (name.indexOf(prefix) == 0) {
errorMessage.text('error message 1'); // starts with XY
} else {
errorMessage.text('error message 2')
}
}
});
$('form').submit(function() {
return isValid; // will cancel the default submit if false
});
附注:您当然需要在服务器端重复此验证。客户端验证是一个很好的奖励,但可以被覆盖(永远不要信任用户输入)。