MVC验证-Nullable Bool-通过单选按钮强制进行真/假选择

本文关键字:选择 -Nullable 验证 Bool- 单选按钮 MVC | 更新日期: 2023-09-27 18:00:13

在MVC应用程序中

其中一个字段是可为null的bool类型,并且显示为单选按钮集

如何通过设置数据属性来执行客户端验证

正在使用客户端验证(jquery不引人注目)

目前,我已经将可为null的bool模板化为单选按钮提供给用户。有3个单选按钮,一个用于True,一个用作False,一个为null。

null单选按钮是隐藏的,因此用户将被迫从true或false选项中进行选择(null不是有效选项,null只是意味着用户尚未做出选择-必须选择true或false)

我已经尝试了以下,我在其他地方找到了相同问题的答案

[Range(typeof(bool), "false", "true", ErrorMessage = "You must make a selection")]

但这从未通过验证

我也试过

[Required]

但这并不强迫用户进行选择

进一步信息:-

当bool?显示为单选按钮。如果使用bool的MVC默认模板?(这是一个下拉列表,有3个选项,"未设置"、"真"、"假",然后验证按预期工作。

当显示为单选按钮时,单选按钮可以正常工作,并将正确的状态保存到数据库中,但验证不起作用。

示例代码

型号:-

public class SomeModel
{
    [Required]
    public string Name { get; set; }
    [Required]
    public bool? SomeBool { get; set; }
}

视图:-

@using (Html.BeginForm())
{
    @Html.ValidationSummary(true)
    <fieldset>
        <div class="editor-label">
            @Html.LabelFor(model => model.Name)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Name)
            @Html.ValidationMessageFor(model => model.Name)
        </div>
        <div class="editor-label">
            @Html.LabelFor(model => model.SomeBool)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.SomeBool)
            @Html.ValidationMessageFor(model => model.SomeBool)
        </div>
        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}

上面的工作与预期一样,没有为bool设置编辑器模板,但没有为单选按钮设置编辑器模板。

单选按钮模板:-

@model bool?
<div>
    @{
        Dictionary<string, object> yesAttrs = new Dictionary<string, object>();
        Dictionary<string, object> noAttrs = new Dictionary<string, object>();
        Dictionary<string, object> nullAttrs = new Dictionary<string, object>();
        yesAttrs.Add("id", ViewData.TemplateInfo.GetFullHtmlFieldId("") + "Yes");
        noAttrs.Add("id", ViewData.TemplateInfo.GetFullHtmlFieldId("") + "No");
        nullAttrs.Add("id", ViewData.TemplateInfo.GetFullHtmlFieldId("") + "NA");
        if (Model.HasValue && Model.Value)
        {
            yesAttrs.Add("checked", "checked");
        }
        else if (Model.HasValue && !Model.Value)
        {
            noAttrs.Add("checked", "checked");
        }
        else
        {
            nullAttrs.Add("checked", "checked");
        }
    }
    @Html.RadioButtonFor(x => x, "true", yesAttrs) <label for="@(ViewData.TemplateInfo.GetFullHtmlFieldId(""))Yes">Yes</label>
    @Html.RadioButtonFor(x => x, "false", noAttrs) <label for="@(ViewData.TemplateInfo.GetFullHtmlFieldId(""))No">No</label>
    <span style="display: none">
        @Html.RadioButtonFor(x => x, "null", nullAttrs) <label for="@(ViewData.TemplateInfo.GetFullHtmlFieldId(""))NA">N/A</label>
    </span>
</div>

问题将与没有为单选按钮

MVC验证-Nullable Bool-通过单选按钮强制进行真/假选择

创建客户端验证数据属性有关

您可以为此目的编写您的小属性:

public class TrueFalseBoolAttribute: ValidationAttribute
{
    public override bool IsValid(Object value)
    {
        return value is bool;
    }
}

这应该对你有用。但我也认为,如果你想有3个选项,最好的方法是Enum。

型号:

public bool? boolObj { get; set; }
public int intObj { get; set; }

视图:

@Html.TextBoxFor(p => p.boolObj )
@Html.TextBoxFor(p => p.intObj )

你可以从一个视图源看到页面上发生了什么:

<input data-val="true" data-val-required="The boolObj field is required." id="boolObj " name="boolObj " type="text" value="False">
<input data-val="true" data-val-number="The field intObj must be a number." data-val-required="The intObj field is required." id="intObj " name="intObj " type="text" value="0">

可为null的bool没有验证属性,而bool有一个data-val-required标记。int具有data-val-required标记和data-val-number attribute

当然,在复选框上,这是非常多余的,因为它只能被选中(true)或不被选中(false),所以所需的标记没有多大用处。