Я работаю над проектом ASP.Net core 3.1 MVC, в котором мне нужно создать собственный валидатор, и я хочу, чтобы он работал как на стороне клиента, так и на стороне сервера (например, обязательный атрибут).
Я разработал простой пользовательский валидатор, как показано ниже, только для POC -
public class ImportantAttribute : ValidationAttribute, IClientModelValidator
{
public void AddValidation(ClientModelValidationContext context)
{
if (context == null)
{
throw new ArgumentNullException(nameof(context));
}
AttributeUtils.MergeAttribute(context.Attributes, "data-val", "true");
AttributeUtils.MergeAttribute(context.Attributes, "data-val-important", FormatErrorMessage(context.ModelMetadata.GetDisplayName()));
}
public class AttributeUtils
{
public static bool MergeAttribute(
IDictionary<string, string> attributes,
string key,
string value)
{
if (attributes.ContainsKey(key))
{
return false;
}
attributes.Add(key, value);
return true;
}
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
if (value != null)
{
string val = value.ToString();
if (val.Contains("hello"))
{
return ValidationResult.Success;
}
}
return new ValidationResult("Value not valid");
}
}
и использовал этот атрибут для свойства и создал представление, используя ту же модель.
Они изменили тег формы, чтобы он стал формой ajax, например:
<form asp-action="Index" role="form" data-ajax="true" data-ajax-method="post">
<div asp-validation-summary="All" class="text-danger"></div>
<div class="form-group">
<label asp-for="Name" class="control-label"></label>
<input asp-for="Name" class="form-control" value="SGSM" />
<span asp-validation-for="Name" class="text-danger"></span>
</div>
<div class="form-group">
<input type="submit" value="Create" class="btn btn-primary" />
</div>
</form>
Затем я добавил ниже java-скрипт -
$(document).ready(() => {
console.log('I\'m ready bro');
$.validator.addMethod("important",
function (value, element, params) {
console.log('1', value);
return value.contains('hello');
}, "Not OK");
$.validator.unobtrusive.adapters.add("important",
['important'],
function (options) {
console.log('2', options);
options.rules["important"] = options.important;
options.messages["important"] = options.message;
});
});
Когда я запускаю это, вводя любое значение в текстовое поле и отправляя форму, на странице не отображается никакого сообщения об ошибке, но если я поставлю точку останова в методе действия, ModelState покажет правильную информацию.
Если я создам форму как обычную форму (т. е. форму без ajax), все будет работать так, как ожидалось.
Я много искал, но не мог найти ничего связанного.