CheckInfo (DisplayTemplate)
Konfigurationen des CheckInfoDisplay-DisplayTemplates. Es stellt einen
bool-Wert als Icon (Haken/Kreuz) mit Beschriftung dar (Einbindung über
@Html.DisplayFor(...) mit [UIHint(UiDisplay.Basis.CheckInfo)]).
CheckInfo (Grundfall)
Ein bool als Icon mit Beschriftung: true zeigt den Haken, false das Kreuz. Derselbe Aufruf, das Template entscheidet am Wert.
@model DisplayCheckInfoBeispielViewModel
@* Beide Zustände nebeneinander: Das Template wählt das Icon allein aus dem Wert, der Aufruf ist
für true und false derselbe. *@
@Html.DisplayFor(m => m.JaWert)
@Html.DisplayFor(m => m.NeinWert)
using System.ComponentModel.DataAnnotations;
namespace FMH.Komponente.WebUI.Areas.Basis.Models
{
public class DisplayCheckInfoBeispielViewModel
{
[Display(Name = "Vertrag akzeptiert")]
[UIHint(UiDisplay.Basis.CheckInfo)]
public bool JaWert { get; set; } = true;
[Display(Name = "Newsletter abonniert")]
[UIHint(UiDisplay.Basis.CheckInfo)]
public bool NeinWert { get; set; } = false;
}
}
Darstellung
Das CheckInfoDisplay-DisplayTemplate stellt einen bool als Icon mit Beschriftung dar: bei true ein Haken (Done), bei false ein Kreuz (Close). Die Verwendung ist analog zu den EditorTemplates, konfiguriert wird über die Data Annotations.
[Display(Name = "Vertrag akzeptiert")]
[UIHint(UiDisplay.Basis.CheckInfo)]
public bool JaWert { get; set; } = true;
[Display(Name = "Newsletter abonniert")]
[UIHint(UiDisplay.Basis.CheckInfo)]
public bool NeinWert { get; set; }
@Html.DisplayFor(m => m.JaWert)
@Html.DisplayFor(m => m.NeinWert)
Der Aufruf ist für beide Zustände derselbe, das Template wählt das Icon allein aus dem Wert. Gedacht ist das für Prüflisten und Übersichten, in denen mehrere Ja/Nein-Angaben untereinander stehen.
Weitere Konfigurationen
| Konfiguration | Wirkung |
|---|---|
[Display(Name = "…")] |
Beschriftung neben dem Icon |
[HelpText(Name = "…")] |
Zusätzliches Info-Icon dahinter, der Text erscheint als Tooltip |
[AdditionalMetadata(UiMetadata.Basis.IconTrue, IconType.ThumbUp)] |
Eigenes Icon für true, siehe Beispiel «CheckInfo mit eigenen Icons» |
[AdditionalMetadata(UiMetadata.Basis.IconFalse, IconType.ThumbDown)] |
Eigenes Icon für false, gleiches Beispiel |
[DisplayFromViewModel(nameof(Bezeichnung))] |
Beschriftung aus einer Eigenschaft des ViewModels, siehe Beispiel «CheckInfo mit Text aus dem ViewModel» |
CheckInfo mit eigenen Icons
Daumen hoch statt Haken, Daumen runter statt Kreuz. Beide Zustände stehen als AdditionalMetadata am Modell.
@model DisplayCheckInfoIconsBeispielViewModel
@* Die Icons stehen am Modell, der Aufruf bleibt unverändert. *@
@Html.DisplayFor(m => m.IstOk)
@Html.DisplayFor(m => m.IstSchlecht)
using System.ComponentModel.DataAnnotations;
using FMH.Komponente.Basis.Ui.Validation.DataAnnotation;
using FMH.Komponente.Infrastruktur.Schnittstellen.Ui;
namespace FMH.Komponente.WebUI.Areas.Basis.Models
{
/// <summary>
/// CheckInfo mit eigenen Icons: Beide Zustände sind einzeln gesetzt, gerendert wird immer nur
/// der, den der Wert der Eigenschaft trifft.
/// </summary>
public class DisplayCheckInfoIconsBeispielViewModel
{
[Display(Name = "Super gemacht")]
[UIHint(UiDisplay.Basis.CheckInfo)]
[AdditionalMetadata(UiMetadata.Basis.IconTrue, IconType.ThumbUp)]
[AdditionalMetadata(UiMetadata.Basis.IconFalse, IconType.ThumbDown)]
public bool IstOk { get; set; } = true;
[Display(Name = "War nicht gut")]
[UIHint(UiDisplay.Basis.CheckInfo)]
[AdditionalMetadata(UiMetadata.Basis.IconTrue, IconType.ThumbUp)]
[AdditionalMetadata(UiMetadata.Basis.IconFalse, IconType.ThumbDown)]
public bool IstSchlecht { get; set; }
}
}
Darstellung
Über [AdditionalMetadata] lassen sich die Icons selbst bestimmen, je eines für true und für false:
[Display(Name = "Super gemacht")]
[UIHint(UiDisplay.Basis.CheckInfo)]
[AdditionalMetadata(UiMetadata.Basis.IconTrue, IconType.ThumbUp)]
[AdditionalMetadata(UiMetadata.Basis.IconFalse, IconType.ThumbDown)]
public bool IstOk { get; set; } = true;
@Html.DisplayFor(m => m.IstOk)
Drei Dinge sind dabei zu wissen:
- Beide Angaben sind unabhängig. Wer nur
MetaDataIconTruesetzt, bekommt fürfalseweiterhin das Kreuz. Gerendert wird ohnehin immer nur das Icon des Zustands, den der Wert trifft. - Der Wert wird als
IconTypegelesen. Das Template löst ihn überEnum.TryParseauf,IconType.ThumbUpund die Zeichenkettenameof(IconType.ThumbUp)sind also gleichwertig. Passt der Wert zu keinem Eintrag, bleibt es beim Standard-Icon, ohne Fehler. - Voraussetzung ist der
AdditionalMetadataProvider. Er trägt die Metadaten inModelMetadata.AdditionalValuesein und wird vonAddFmhWidgetOptions()registriert. Ohne ihn erscheinen die Standard-Icons. Das Attribut liegt im PaketFMH.Komponente.Basis.Validierung,AddFmhWidgetOptions()inFMH.Komponente.Basis.
CheckInfo mit Text aus dem ViewModel
Die Beschriftung kommt über DisplayFromViewModel aus einer zweiten Eigenschaft, für Prüflisten aus Konfiguration oder Datenbank.
@model DisplayCheckInfoTextBeispielViewModel
@* Die Beschriftung kommt aus der Eigenschaft Bezeichnung desselben ViewModels. *@
@Html.DisplayFor(m => m.IstDynamisch)
using System.ComponentModel.DataAnnotations;
using FMH.Komponente.Basis.Ui.Validation.DataAnnotation;
namespace FMH.Komponente.WebUI.Areas.Basis.Models
{
/// <summary>
/// CheckInfo mit dynamischer Beschriftung: Der Text steht nicht im Attribut, sondern in einer
/// zweiten Eigenschaft des ViewModels.
/// </summary>
/// <remarks>
/// Der übliche Fall sind Prüflisten, deren Punkte aus einer Konfiguration oder der Datenbank
/// kommen: Der Text wechselt je Datensatz, ein <c>[Display(Name = "…")]</c> ist deshalb nicht
/// möglich.
/// </remarks>
public class DisplayCheckInfoTextBeispielViewModel
{
/// <summary>
/// Holt oder setzt die Beschriftung. In einem Projekt kommt sie aus der Datenbank.
/// </summary>
public string Bezeichnung { get; set; } = "Facharzttitel im Register hinterlegt";
[UIHint(UiDisplay.Basis.CheckInfo)]
[DisplayFromViewModel(nameof(Bezeichnung))]
public bool IstDynamisch { get; set; } = true;
}
}
Darstellung
Wechselt die Beschriftung je Datensatz, steht sie nicht im Attribut, sondern in einer zweiten Eigenschaft des ViewModels. [DisplayFromViewModel] nennt diese Eigenschaft, [Display] wird damit überflüssig:
public string Bezeichnung { get; set; } = "Facharzttitel im Register hinterlegt";
[UIHint(UiDisplay.Basis.CheckInfo)]
[DisplayFromViewModel(nameof(Bezeichnung))]
public bool IstDynamisch { get; set; } = true;
@Html.DisplayFor(m => m.IstDynamisch)
Aufgelöst wird der Text zur Renderzeit am umschliessenden Modell. Das Attribut wirkt deshalb nur, wenn die Eigenschaft Teil eines ViewModels ist, nicht bei einem bool, der für sich allein an DisplayFor geht. Findet das Template die genannte Eigenschaft nicht, bleibt die Beschriftung leer, das Icon erscheint trotzdem.
Dasselbe Attribut steuert auch die Beschriftung von Eingabefeldern, siehe EditorTemplates › Label aus dem ViewModel.