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>
问题将与没有为单选按钮
您可以为此目的编写您的小属性:
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),所以所需的标记没有多大用处。