Compliquant une primitive avec des champs cachés de préciser si False ou Null n'est pas recommandé.
Case à cocher n'est pas ce que vous devriez être en utilisant -- il n'a en fait qu'un état: Vérifié. Sinon, il pourrait être n'importe quoi.
Lorsque votre champ de base de données est un boolean nullable (bool?
), le UX devez utiliser de 3 Boutons Radio, où le premier bouton représente votre "Checked", le deuxième bouton représente "Non Vérifié" et le troisième bouton représente votre null, quelle que soit la sémantique de null. Vous pouvez utiliser un <select><option>
la liste déroulante enregistrer l'immobilier, mais l'utilisateur doit cliquer deux fois et les choix ne sont pas presque aussi instantanément clair.
1 0 null
True False Not Set
Yes No Undecided
Male Female Unknown
On Off Not Detected
Le RadioButtonList, défini comme une extension nommée RadioButtonForSelectList, s'appuie sur les boutons pour vous, y compris la sélection, la valeur, et définit l' <div class="RBxxxx">
de sorte que vous pouvez utiliser css pour faire de votre radio boutons aller à l'horizontale (display: inline-block), à la verticale, ou dans une table de la mode (display: inline-block; width:100px;)
Dans le modèle (je suis l'aide de la chaîne, chaîne pour la définition du dictionnaire comme un exemple pédagogique. Vous pouvez utiliser bool?, chaîne de caractères)
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());
}
}