如果选中复选框,则需要字段

时间:2018-02-15 14:22:38

标签: c# validation asp.net-core-mvc

如果选中相同表单中的复选框,我需要一个表单中的字段。

使用常规模型验证似乎没有办法做到这一点,所以我在控制器中创建了一个远程验证方法。

问题是,由于该领域并不总是需要,如果我把它放在场上,验证甚至不会激发。所以我尝试将验证放在复选框上,现在我遇到了一个不同的问题,即当我向该字段添加文本时,验证不会触发。

有没有办法做我需要的自定义验证,还是我需要在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);
}

2 个答案:

答案 0 :(得分:0)

我已经以类似的方式使用自定义验证器实现了这一点。但是,我将注释应用于所需的字段,并在参数中包含一个条件,例如:

[RequiredIf("NotRecommended = true")]
public string Notes { get; set; }

但是,正如您可能已经意识到的那样,没有办法在数据注释中交叉引用另一个属性,因此您需要构建javascript来处理它。

不显眼的验证添加了数据-val =&#34; true&#34;和data-val-required =&#34;错误消息&#34;属性为输入元素,因此当选中复选框时,通过javascript添加此元素将起作用。

您还需要重新初始化表单验证,以便添加具有新应用的验证属性的输入。

答案 1 :(得分:0)

乔在评论中给了我很多答案,但是没有把它作为答案发布,所以我会把它发布给其他可能需要这样做的人。

创建属性 https://github.com/joeaudette/cloudscribe/blob/master/src/cloudscribe.Web.Common/DataAnnotations/RequiredWhenAttribute.cs

Joe的客户端验证 https://github.com/cloudscribe/cloudscribe/blob/master/src/cloudscribe.Web.StaticFiles/js/cloudscribe-validation-requiredwhen.js

修改了客户端验证

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