[英]unobtrusive validation with custom data annotation not working
我在 .net mvc 5 項目中遇到了一些自定義數據驗證問題。 我創建了自定義 ValidateAgeAttribute.cs,其中包含一些自定義數據驗證。 而且,我有一個 customvalidation.js 文件,我在其中添加了方法和適配器。 不能讓它工作......不開火。 其他驗證(開箱即用)在同一表單上以不顯眼的方式正常工作。 它僅在自定義上失敗。 任何幫助或建議都非常受歡迎。
提前致謝。
[AttributeUsage(AttributeTargets.Property, AllowMultiple = true)]
public class ValidateAgeAttribute : ValidationAttribute, IClientValidatable
{
private const string DefaultErrorMessage = "Your age is invalid, your {0} should fall between {1} and {2}";
public DateTime MinimumDateProperty { get; private set; }
public DateTime MaximumDateProperty { get; private set; }
public ValidateAgeAttribute(
int minimumAgeProperty,
int maximumAgeProperty)
: base(DefaultErrorMessage)
{
MaximumDateProperty = DateTime.Now.AddYears(minimumAgeProperty * -1);
MinimumDateProperty = DateTime.Now.AddYears(maximumAgeProperty * -1);
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
DateTime datevalue;
if (value != null)
{
if (DateTime.TryParse(value.ToString(), out datevalue))
{
if (value != null)
{
DateTime parsedValue = (DateTime)datevalue;
if (parsedValue <= MinimumDateProperty || parsedValue >= MaximumDateProperty)
{
return new ValidationResult(FormatErrorMessage(validationContext.DisplayName));
}
}
}
}
return ValidationResult.Success;
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
var rule = new ModelClientValidationRule()
{
ValidationType = "validateage",
ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()),
};
rule.ValidationParameters.Add("minumumdate", MinimumDateProperty.ToShortDateString());
rule.ValidationParameters.Add("maximumdate", MaximumDateProperty.ToShortDateString());
return new[] { rule };
}
public override string FormatErrorMessage(string name)
{
return string.Format(ErrorMessageString, name, MinimumDateProperty.ToShortDateString(), MaximumDateProperty.ToShortDateString());
}
}
js:
$(document).ready(function () {
$.validator.addMethod(
'validateage',
function (value, element, params) {
return this.optional(element) || (dateConverter(value) >= dateConverter(params.minumumdate) && dateConverter(value) <= dateConverter(params.maximumdate));
});
$.validator.unobtrusive.adapters.add(
'validateage', ['minumumdate', 'maximumdate'], function (options) {
var params = {
minumumdate: options.params.minumumdate,
maximumdate: options.params.maximumdate
};
options.rules['validateage'] = params;
options.messages['validateage'] = options.message;
});
});
function dateConverter(value) {
var valueParts = value.split("/");
return new Date(+valueParts[2], valueParts[1] - 1, +valueParts[0]);
}
腳本調用順序:
<script src="~/Scripts/jquery.validate.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.js"></script>
<script src="~/Scripts/shared/custom-validators.js"></script>
和渲染的視圖輸入:
<input class="form-control text-box single-line valid" data-val="true" data-val-validateage="Date de naissance incorrecte" data-val-validateage-maximumdate="07/01/2020" data-val-validateage-minumumdate="07/01/1925" id="Birthdate" name="Birthdate" type="text" value="" aria-describedby="Birthdate-error" aria-invalid="false">
我發現了這個問題。 我在與視圖相關的 js 中將我的輔助操作稱為“revindvalidators”,但它很快就會觸發,我將它放在驗證器添加之后。 現在它起作用了。
$(document).ready(function () {
// The validateage function
$.validator.addMethod(
'validateage',
function (value, element, params) {
return this.optional(element) || (dateConverter(value) >= dateConverter(params.minumumdate) && dateConverter(value) <= dateConverter(params.maximumdate));
});
$.validator.unobtrusive.adapters.add(
'validateage', ['minumumdate', 'maximumdate'], function (options) {
var params = {
minumumdate: options.params.minumumdate,
maximumdate: options.params.maximumdate
};
options.rules['validateage'] = params;
options.messages['validateage'] = options.message;
});
helper.rebinvalidators();
});
function dateConverter(value) {
var valueParts = value.split("/");
return new Date(+valueParts[2], valueParts[1] - 1, +valueParts[0]);
}
我的幫助文件中的 rebindvalidators 方法包含以下代碼:
rebinvalidators: function() {
var $form = $("#formId");
$form.unbind();
$form.data("validator", null);
$.validator.unobtrusive.parse($form);
$form.validate($form.data("unobtrusiveValidation").options);
},
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.