Сообщение о проверке не отображается для пользовательского атрибута в .Net Core - PullRequest
0 голосов
/ 26 ноября 2018

Я создаю пользовательский атрибут для проверки для переопределения RegularExpressionAttribute в .Net Core и реализовал IClientModelValidator для проверки на стороне клиента.проверка применяется к полю, но не отображает сообщение об ошибке для него.ModelState.IsValid также дает Invalid это поле, но сообщение проверки не отображается.

ViewModel

[Required]
[Display(Name = "First Name")]
[RestrictSplCharacters]
public string FirstName { get; set; }

Переопределить атрибут

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = false)]
public class RestrictSplCharactersAttribute : RegularExpressionAttribute, IClientModelValidator
{
   private string errorMessage= "Special characters or blank space is not allowed in {0}";

public RestrictSplCharactersAttribute()
    : base(@"[_A-z0-9]*((-|\s)*[_A-z0-9])*$")
{
    this.ErrorMessage = this.errorMessage;
}

public void AddValidation(ClientModelValidationContext context)
{
    MergeAttribute(context.Attributes, "data-val", "true");
    var errorMessage = FormatErrorMessage(context.ModelMetadata.GetDisplayName());
    MergeAttribute(context.Attributes, "data-val-restrictSplCharacters", errorMessage);
}

private bool MergeAttribute(
    IDictionary<string, string> attributes,
    string key,
    string value)
{
    if (attributes.ContainsKey(key))
    {
        return false;
    }
    attributes.Add(key, value);
    return true;
}
}

В HTML контроль похож на

<div class="oneditshow">
<input autocomplete="off" class="k-textbox valid k-valid" data-val="true" data-val-required="The First Name field is required." data-val-restrictSplCharacters="Special characters or blank space is not allowed in First Name" id="FirstName" name="FirstName" placeholder="First Name" required="required" style="width: 100%" value="" aria-required="true" aria-describedby="FirstName-error">
<span class="text-danger field-validation-valid" data-valmsg-for="FirstName" data-valmsg-replace="true" style="display: none;"></span>
   </div>

Функция Javascript

<script>

    var $jQval = $.validator;

    $jQval.addMethod("restrictSplCharacters",
        function (value, element, parameters) {
            var regExp = "/[_A-z0-9]*((-|\s)*[_A-z0-9])*$/";
            if (value.match(regExp)) {
                return true;
            } else {
                return false;
            }
        });
    var adapters = $jQval.unobtrusive.adapters;
    adapters.addBool("restrictSplCharacters");
</script>

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Спасибо, проверка на стороне клиента не запускается, потому что это пользовательский интерфейс кендо.Я заменяю свой JavaScript на JavaScript ниже для правила пользовательской проверки кендо.

    //register custom validation rules
(function ($, kendo) {
    $.extend(true, kendo.ui.validator, {
        rules: { // custom rules
            restrictSpecialCharacters: function (input, params) {
                //check for the rule attribute 
                if (input.filter("[data-val-restrictSpecialCharacters]").length && input.val()) {
                    return /[_A-z0-9]*((-|\s)*[_A-z0-9])*$/.test(input.val());
                }
                return true;
            }
        },
        messages: { //custom rules messages
            restrictSpecialCharacters: function (input) {
                // return the message text
                return input.attr("data-val-restrictSpecialCharacters");
            }
        }
    });
})(jQuery, kendo);
0 голосов
/ 26 ноября 2018

Попробуйте добавить следующий код после public void AddValidation в RestrictSpecialCharactersAttribute.

public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
    ModelClientValidationRule mvr = new ModelClientValidationRule();
    mvr.ErrorMessage = this.eRRORMESSAGE;
    mvr.ValidationType = "restrictSpecialCharacters";
    return new[] { mvr };
}

Более подробную информацию можно найти здесь .

...