我正在通过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; }
我们非常感谢您的帮助。
答案 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);
是表单的选择器。