BooleanCombobox

Das BooleanCombobox-EditorTemplate kombiniert eine Ja/Nein-Auswahl mit einer Combobox, die erst bei „Ja“ erscheint. Einbindung über @Html.EditorFor(...) mit [UIHint("BooleanCombobox")] auf einer Eigenschaft vom Typ BooleanComboboxControl.

BooleanCombobox

Ja/Nein-Auswahl mit Combobox, die erst bei „Ja“ erscheint.

@model BooleanComboboxBeispielViewModel

<form class="fmh-demo-form">
    @Html.EditorFor(m => m.Fachgesellschaft)
</form>
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using FMH.Komponente.Basis.Ui.Controls;
using Microsoft.AspNetCore.Mvc.Rendering;

namespace FMH.Komponente.WebUI.Areas.Basis.Models
{
    public class BooleanComboboxBeispielViewModel
    {
        [Display(Name = "Mitglied einer Fachgesellschaft")]
        [UIHint("BooleanCombobox")]
        public BooleanComboboxControl Fachgesellschaft { get; set; } = new BooleanComboboxControl
                                                                      {
                                                                          AuswahlLabel = "Welche Fachgesellschaft?",
                                                                          ComboboxAuswahl = new List<SelectListItem>
                                                                                            {
                                                                                                new ("Allgemeine Innere Medizin", "1"),
                                                                                                new ("Chirurgie", "2"),
                                                                                                new ("Kardiologie", "3"),
                                                                                                new ("Psychiatrie und Psychotherapie", "4"),
                                                                                            },
                                                                      };
    }
}

Darstellung

Das BooleanCombobox-EditorTemplate beantwortet ein wiederkehrendes Formularmuster in einem Feld: eine Ja/Nein-Frage, die bei „Ja“ eine Anschlussauswahl verlangt. Die Combobox ist zunächst ausgeblendet und erscheint erst, wenn „Ja“ gewählt wird.

Anders als die übrigen EditorTemplates hängt es nicht an einem einfachen Typ, sondern an einer Eigenschaft vom Typ BooleanComboboxControl. Dieser Typ bringt die Verdrahtung bereits mit — die Auswahlliste ist das Einzige, was das ViewModel liefern muss.

[Display(Name = "Mitglied einer Fachgesellschaft")]
[UIHint("BooleanCombobox")]
public BooleanComboboxControl Fachgesellschaft { get; set; } = new BooleanComboboxControl
{
    AuswahlLabel = "Welche Fachgesellschaft?",
    ComboboxAuswahl = new List<SelectListItem> { new ("Chirurgie", "2"), … },
};

Bestandteile von BooleanComboboxControl

Eigenschaft Bedeutung
BooleanFlag (bool?) Die Ja/Nein-Auswahl; der eigentliche Wert des Controls (Value)
AuswahlId (int?) Die getroffene Auswahl – die Werte der Liste müssen deshalb Zahlen sein
ComboboxAuswahl Die Einträge der Combobox (IEnumerable<SelectListItem>)
AuswahlLabel Beschriftung über der Combobox; ohne Angabe der Standardtext aus den Ressourcen
IsRequired Wird vom Template aus der Metadata gesetzt – nicht selbst befüllen

Weitere Konfigurationen

Konfiguration Wirkung
[Display(Name = "…")] Beschriftung der Ja/Nein-Frage
[Required] / [RequiredIf] Macht die Ja/Nein-Auswahl zur Pflicht (das Template reicht das über IsRequired an BooleanFlag weiter)
[HelpText(Name = "…")] Ergänzender Hilfetext unter dem Feld
AuswahlLabel Beschriftung der Combobox, statt des Standardtexts

Wie das Ein- und Ausblenden zustande kommt

Das Control setzt auf dieselbe Mechanik wie die Demo-Seite „Validierung › RequiredIf“: AuswahlId trägt ein [RequiredIf(nameof(BooleanFlag), "True", …, HideIfNotRequired = true)]. Die Combobox wird also nicht durch eigenen Code der Seite, sondern durch die RequiredIf-Logik ein- und ausgeblendet und gleichzeitig zum Pflichtfeld.

Zusätzlich spiegelt initialisiereBooleanComboboxLogik() (in jquery-fmh-validation.js) den gewählten Radio-Wert in ein verstecktes Feld, das die Eigenschaft selbst trägt — dadurch hat das Control auch als Ganzes einen Wert und nicht nur seine Teil-Eigenschaften.

Für ein Formular mit echtem Abschicken ist deshalb nichts weiter nötig als [Required] auf der Eigenschaft: Ohne Ja/Nein-Antwort meldet die Ja/Nein-Auswahl, bei „Ja“ ohne Auswahl die Combobox.