0

我在 for-each 循环的帮助下生成了一些控件。我想验证文本框取决于下拉菜单的答案。对于某些问题,如果下拉列表中的选定项目为“是”,则应启用验证器;对于某些问题,如果下拉列表中的答案为“否”,则应启用验证器。目前它为两者触发,因为我不知道如何控制它,因为控件是动态生成的

看法

        @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; }

非常感谢任何帮助。

4

1 回答 1

1

解决方案有两个部分,因为验证应该在服务器和客户端上进行。

在服务器上,您应该[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);

wherejqForm是您的表单的 jQuery 对象,并且formId是表单的选择器。

于 2018-11-06T09:00:02.227 回答