如果选中相同表单中的复选框,我需要一个表单中的字段。
使用常规模型验证似乎没有办法做到这一点,所以我在控制器中创建了一个远程验证方法。
问题是,由于该领域并不总是需要,如果我把它放在场上,验证甚至不会激发。所以我尝试将验证放在复选框上,现在我遇到了一个不同的问题,即当我向该字段添加文本时,验证不会触发。
有没有办法做我需要的自定义验证,还是我需要在JavaScript中做些什么?如果是这样,我需要做什么?
形式:
<form>
<input type="checkbox" asp-for="NotRecommended" checked=@Model.NotRecommended /> <label>Not Recommended</label>
<textarea class="form-control" id="Notes" asp-for="Notes"></textarea>
<span asp-validation-for="NotRecommended" class="text-danger"></span>
</form>
型号:
public class DetailsViewModel
{
[DisplayName("Not Recommended")]
[Remote("RequireNoteForFlag", AdditionalFields = "Notes", ErrorMessage = "Note is required when flagging someone.")]
public bool NotRecommended { get; set; }
[DataType(DataType.MultilineText)]
[MaxLength(1500)]
[DisplayName("Notes")]
public string Notes { get; set; }
}
远程验证器
public IActionResult RequireNoteForFlag(bool NotRecommended, string Notes)
{
if (NotRecommended && String.IsNullOrWhiteSpace(Notes)) return Json("Note is required when flagging an Assessor");
else return Json(true);
}
答案 0 :(得分:0)
我已经以类似的方式使用自定义验证器实现了这一点。但是,我将注释应用于所需的字段,并在参数中包含一个条件,例如:
[RequiredIf("NotRecommended = true")]
public string Notes { get; set; }
但是,正如您可能已经意识到的那样,没有办法在数据注释中交叉引用另一个属性,因此您需要构建javascript来处理它。
不显眼的验证添加了数据-val =&#34; true&#34;和data-val-required =&#34;错误消息&#34;属性为输入元素,因此当选中复选框时,通过javascript添加此元素将起作用。
您还需要重新初始化表单验证,以便添加具有新应用的验证属性的输入。
答案 1 :(得分:0)
乔在评论中给了我很多答案,但是没有把它作为答案发布,所以我会把它发布给其他可能需要这样做的人。
修改了客户端验证
jQuery.validator.addMethod("requiredwhen", function (value, element, param) {
var otherPropId = $(element).data('val-other');
if (otherPropId) {
var otherProp = $(otherPropId)[0].checked;
if (otherProp) {
return element.value.length > 0;
}
}
return true;
});
jQuery.validator.unobtrusive.adapters.addBool("requiredwhen");
查看强>
<input type="checkbox" asp-for="NotRecommended" /> <label asp-for="NotRecommended"></label>
<textarea class="form-control" id="Notes" asp-for="Notes"></textarea>
<span asp-validation-for="NotRecommended" class="text-danger"></span>
<强>模型强>
[DisplayName("Not Recommended")]
public bool NotRecommended { get; set; }
[DataType(DataType.MultilineText)]
[MaxLength(1500)]
[DisplayName("Notes")]
[RequiredWhen("NotRecommended", true, AllowEmptyStrings = false, ErrorMessage ="A note is required when flagging an Assessor.")]
public string Notes { get; set; }