Требуемый валидатор поля для текстового поля в MVC зависит от динамически создаваемого выпадающего списка - PullRequest
0 голосов
/ 06 ноября 2018

Я генерирую некоторые элементы управления с помощью цикла for-each. Я хотел бы проверить текстовое поле в зависимости от ответа выпадающего. Для некоторых вопросов должен быть включен валидатор, если выбранный элемент в раскрывающемся списке «да», а для некоторых вопросов должен быть включен валидатор, если ответ из раскрывающегося списка - «нет». На данный момент он срабатывает для обоих, потому что я не знаю, как управлять им, поскольку элементы управления генерируются динамически

View

        @for (int a = 0; a < Model.ServiceQaVisits.Count(); a++)
        {
            if (Model.ServiceQaQuestions[a].sqqQuestionID == Model.ServiceQaVisits[a].sqvQuestionID)
            {
                <div>
                    @Html.DisplayTextFor(m => m.ServiceQaVisits[a].sqvQuestionID)
                    @Html.DisplayTextFor(m => m.ServiceQaQuestions[a].sqqQuestion)
                    @Html.HiddenFor(m => m.ServiceQaVisits[a].sqvQAID)
                    @if (Model.ServiceQaQuestions[a].sqqQuestionTypeID == 1)
                    {

                        @Html.TextBoxFor(m => m.ServiceQaVisits[a].sqvAnswer)
                    }
                    else if (Model.ServiceQaQuestions[a].sqqQuestionTypeID == 2)
                    {
                        List<string> lista = new List<string>() { "Yes", "No" };
                        @Html.DropDownListFor(m => m.ServiceQaVisits[a].sqvAnswer, new SelectList(lista), "Select Answer")
                    }
                    else
                    {
                        List<string> listb = new List<string>() { "Yes", "No", "N/A" };
                        @Html.DropDownListFor(m => m.ServiceQaVisits[a].sqvAnswer, new SelectList(listb), "Select Answer")
                    }
                    @if (Model.ServiceQaQuestions[a].sqqNegativeAnswer != null)
                    {
                        @Html.TextBoxFor(m => m.ServiceQaVisits[a].sqvComment)
                        @Html.ValidationMessageFor(m => m.ServiceQaVisits[a].sqvComment,"", new {@class = "text-danger"});
                    }


                </div>
            }

        }

Модель

[Required(ErrorMessage = "Please enter the reason")]
    public string sqvComment { get; set; }

Любая помощь высоко ценится.

1 Ответ

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

Решение состоит из двух частей, поскольку проверка должна выполняться как на сервере, так и на клиенте.

На сервере вы должны использовать атрибут [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 - селектор формы.

...