Решение состоит из двух частей, поскольку проверка должна выполняться как на сервере, так и на клиенте.
На сервере вы должны использовать атрибут [CustomValidation]
в свойстве sqvComment
. Например, ваш метод проверки может быть
public static ValidationResult ValidateSqvComment(string value, ValidationContext context)
{
ValidationResult result = ValidationResult.Success;
MyModel model = context.ObjectInstance as MyModel;
if (model.sqvAnswer == "Yes" && String.IsNullOrEmpty(value))
{
result = new ValidationResult("sqvComment is required");
}
return result;
}
и украсьте свою собственность
[CustomValidation(typeof(MyModel), nameof(MyModel.ValidateSqvComment))]
public string sqvComment { get; set; }
На клиенте все сложнее. MVC, если вы посмотрите на сгенерированный источник, добавляет специальные свойства к элементам input
, которые затем анализирует на стороне клиента, чтобы добавить проверку jQuery. в частности, добавляется data-val="true"
для включения проверки, а затем data-val-*=...
, в зависимости от типа проверки. вам нужно динамически добавить эти атрибуты, а затем вызвать функцию анализа для их анализа. В вашем случае вам нужно добавить атрибут data-val-required="sqvComment is required"
в ваше поле sqvComment
(через аргумент htmlAttribute
метода Html.TextBoxFor()
), а затем установить значение data-val
в true
, только если Ответ на раскрывающийся список - «Да» (или какова ваша логика), используя событие onchange
в клиентском коде. Затем вам нужно очистить проверку, которую jQuery уже получил, и воссоздать ее:
jqForm.removeData("unobtrusiveValidation");
jqForm.removeData("validator");
$.validator.unobtrusive.parse(formId);
где jqForm
- это объект jQuery с вашей формой, а formId
- селектор формы.