MVC中文本框的必需字段验证器取决于动态生成的下拉列表

时间:2018-11-06 08:24:24

标签: asp.net-mvc validation model-view-controller asp.net-mvc-validation

我正在通过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; }

我们非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

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

在服务器上,应在[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方法的{{11}}参数),然后设置{{ 1}}到Html.TextBoxFor(),只有在客户端代码中使用data-val事件时,下拉菜单的答案是“是”(或您的逻辑是什么)的情况下。然后,您需要清除jQuery已经获取的验证,然后重新创建它:

true

其中onchange是表单的jQuery对象,而jqForm.removeData("unobtrusiveValidation"); jqForm.removeData("validator"); $.validator.unobtrusive.parse(formId); 是表单的选择器。