Валидация аннотаций пользовательских данных на стороне клиента

Я создал пользовательскую аннотацию данных, чтобы выполнить некоторую проверку на моей модели представления. Проблема в том, что она не проверяется на стороне клиента. Здесь моя модель:

public class MemberViewModel
{
    [ScaffoldColumn(false)]
    public int MemberId { get; set; }

    [Required(ErrorMessage = "Name is required")]
    public string Name { get; set; }

    //My custom data annotation
    [EnforceTrue(ErrorMessage = "You must agree to the Terms and Conditions")]
    public bool AgreeTerms { get; set; }
}

Код проверки аннотации данных:

public class EnforceTrueAttribute : ValidationAttribute, IClientValidatable
{
    public EnforceTrueAttribute() { }

    public override bool IsValid(object value)
    {
        return value != null && (bool)value == true;
    }

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

Мой метод управления:

[HttpPost]
public ActionResult Index(MemberViewModel viewModel)
{
    Member member = new Member();
    TryUpdateModel(member);

    if (ModelState.IsValid)
    {
        _membersRepository.SaveMember(member);

        return RedirectToAction("Index", "Home");       
    }

    return View(viewModel);     // validation error, so redisplay same view            
}

И мое мнение:

@using (Html.BeginForm("Index", "Members", FormMethod.Post)) {

    @Html.HiddenFor(m => m.MemberId)

    <div class="editor-label">@Html.LabelFor(model => model.Name)</div>
    <div class="editor-field">@Html.TextBoxFor(model => model.Name)</div>

    <div class="editor-field">@Html.CheckBoxFor(model => model.AgreeTerms) <label for="AgreeTerms">I agree to the Terms and Conditions</label></div>

    <p>
        <input type="submit" value="Submit" />
    </p>

    @Html.ValidationSummary()
}

Итак, все мои другие сообщения об ошибках отображаются в сводке проверки с проверкой на стороне клиента. Но для моей аннотации пользовательских данных сообщение об ошибке не отображается до тех пор, пока остальная модель не будет действительной, и после отправки формы и перезагрузки страницы, когда ошибка отображается в сводке.

Есть ли что-то еще, что мне нужно сделать, чтобы он появился в сводке с другими ошибками?

Я использую С# и ASP.NET MVC 3

Ответ 1

Недавно была такая же проблема. Вы можете написать:

$.validator.addMethod('enforcetrue', function (value, element) {
    return $(element).is(":checked");
});
$.validator.unobtrusive.adapters.add('enforcetrue', [], function (options) {
    options.messages['enforcetrue'] = options.message;
    options.rules['enforcetrue'] = options.params;
});

Аналогичный вопрос здесь Проверка на стороне клиента ASP.NET MVC 3

Ответ 2

Реализация Iclientvalidatable только добавляет ненавязчивые атрибуты к сгенерированным входам html. Чтобы включить проверку на стороне клиента, вы должны написать валидаторы, которые используют эти ненавязчивые атрибуты для проверки входных данных. Здесь вы можете найти очень хорошее объяснение проверки клиента и сервера в asp.net mvc 3