Я собираюсь выложить код, чтобы объяснить всю ситуацию, а затем изложить описание проблемы:
В моей модели представления у меня есть логическое свойство для отслеживания того, принял ли пользователь термины:
[MustBeTrue(ErrorMessageResourceType = typeof(ErrorMessages), ErrorMessageResourceName = "MustAccept")]
public bool HasAuthorizedBanking { get; set; }
Как вы можете видеть, я создал собственный атрибут проверки для обработки этого MustBeTrue для обработки флажка, поскольку [Обязательный] равен , в настоящее время не работает для проверки на стороне клиента на флажках в MVC3
public class MustBeTrueAttribute : ValidationAttribute, IClientValidatable
{
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
if ((bool)value)
return ValidationResult.Success;
return new ValidationResult(String.Format(ErrorMessageString,validationContext.DisplayName));
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
var rule = new ModelClientValidationRule
{
ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()),
ValidationType = "truerequired"
};
yield return rule;
}
}
Затем я добавляю CheckBoxFor с ValidationMessage к своему представлению:
@Html.CheckBoxFor(model => model.HasAuthorizedBanking)
@Html.ValidationMessageFor(model => model.HasAuthorizedBanking, "", new { @class = "validationtext" })
Для реализации этой клиентской стороны я создал метод валидатора jQuery идобавлен ненавязчивый адаптер:
// Checkbox Validation
jQuery.validator.addMethod("checkrequired", function (value, element) {
var checked = false;
checked = $(element).is(':checked');
return checked;
}, '');
jQuery.validator.unobtrusive.adapters.addBool("truerequired", "checkrequired");
На мой взгляд, все этапы процесса регистрации находятся на одной странице, элементы скрыты и показаны с помощью jQuery и проверены с помощью проверки jQuery.При нажатии кнопки «Далее» каждый элемент ввода на странице запускается для проверки:
var validator = $("#WizardForm").validate(); // obtain validator
var anyError = false;
$step.find("input").each(function () {
if (!validator.element(this)) { // validate every input element inside this step
anyError = true;
}
});
if (anyError)
return false;
Примечания:
- Существует только одно свойствов моей модели с атрибутом MustBeTrue, и есть только один CheckBoxFor и соответствующий ValidationMessageFor на всей странице.
- Чтобы отслеживать, когда вызывается этот метод, я просто помещаю предупреждение (флажок);внутри метода jQuery Validator 'checkrequired'.
Проблема: Когда флажок установлен / снят, метод 'checkrequired' запускается один раз.Однако, когда кнопка «Далее» нажата, и мы решили проверить все элементы ввода, она запускается дважды независимо от того, установлен флажок или нет. Интересно, , если он отмечен, первая проверка возвращает true, а вторая возвращает false (это второе ложное возвращение - моя главная проблема - страница не будет проверяться и не позволит вам перейти к следующему шагу.).Кроме того, когда он отмечен и нажат «Далее», сообщение ValidationMessageFor исчезает, как если бы оно было действительным.
Редактировать: У меня есть другой пользовательский атрибут для проверки возраста в текстовом поле jQuery DatePickerхотя он реализован точно таким же образом - он запускается только один раз при тех же условиях.