No se recomienda complicar una primitiva con campos ocultos para aclarar si False o Null.
La casilla de verificación no es lo que debería usar; en realidad, solo tiene un estado: marcado . De lo contrario, podría ser cualquier cosa.
Cuando el campo de su base de datos es un booleano que acepta valores NULL ( bool?
), la UX debe usar 3 botones de opción, donde el primer botón representa su "Marcado", el segundo botón representa "No marcado" y el tercer botón representa su nulo, cualquiera que sea la semántica de nulo significa. Puede usar una <select><option>
lista desplegable para ahorrar espacio, pero el usuario tiene que hacer clic dos veces y las opciones no son tan claras instantáneamente.
1 0 null
True False Not Set
Yes No Undecided
Male Female Unknown
On Off Not Detected
RadioButtonList, definida como una extensión denominada RadioButtonForSelectList, crea los botones de opción por usted, incluido el valor seleccionado / marcado, y establece el valor <div class="RBxxxx">
para que pueda usar css para hacer que sus botones de opción se vuelvan horizontales (pantalla: bloque en línea), verticales o en forma de tabla (display: inline-block; width: 100px;)
En el modelo (estoy usando cadena, cadena para la definición del diccionario como ejemplo pedagógico. ¿Puede usar bool ?, cadena)
public IEnumerable<SelectListItem> Sexsli { get; set; }
SexDict = new Dictionary<string, string>()
{
{ "M", "Male"},
{ "F", "Female" },
{ "U", "Undecided" },
};
//Convert the Dictionary Type into a SelectListItem Type
Sexsli = SexDict.Select(k =>
new SelectListItem
{
Selected = (k.Key == "U"),
Text = k.Value,
Value = k.Key.ToString()
});
<fieldset id="Gender">
<legend id="GenderLegend" title="Gender - Sex">I am a</legend>
@Html.RadioButtonForSelectList(m => m.Sexsli, Model.Sexsli, "Sex")
@Html.ValidationMessageFor(m => m.Sexsli)
</fieldset>
public static class HtmlExtensions
{
public static MvcHtmlString RadioButtonForSelectList<TModel, TProperty>(
this HtmlHelper<TModel> htmlHelper,
Expression<Func<TModel, TProperty>> expression,
IEnumerable<SelectListItem> listOfValues,
String rbClassName = "Horizontal")
{
var metaData = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
var sb = new StringBuilder();
if (listOfValues != null)
{
// Create a radio button for each item in the list
foreach (SelectListItem item in listOfValues)
{
// Generate an id to be given to the radio button field
var id = string.Format("{0}_{1}", metaData.PropertyName, item.Value);
// Create and populate a radio button using the existing html helpers
var label = htmlHelper.Label(id, HttpUtility.HtmlEncode(item.Text));
var radio = String.Empty;
if (item.Selected == true)
{
radio = htmlHelper.RadioButtonFor(expression, item.Value, new { id = id, @checked = "checked" }).ToHtmlString();
}
else
{
radio = htmlHelper.RadioButtonFor(expression, item.Value, new { id = id }).ToHtmlString();
}// Create the html string to return to client browser
// e.g. <input data-val="true" data-val-required="You must select an option" id="RB_1" name="RB" type="radio" value="1" /><label for="RB_1">Choice 1</label>
sb.AppendFormat("<div class=\"RB{2}\">{0}{1}</div>", radio, label, rbClassName);
}
}
return MvcHtmlString.Create(sb.ToString());
}
}