Table of Contents

Automatisch erzeugte Formulare

Das App-Portal erzeugt Formulare aus den Eingabetypen einer Action.

Formular aus dem Eingabemodell erzeugen

Mit Attributen an der Eingabeklasse legen Sie Beschriftung, Reihenfolge und Darstellung der Felder fest:

public sealed class LagerAusbuchenInput
{
    [Required]
    [Barcode]
    [Field(Label = "Artikelnummer", Placeholder = "Artikel scannen oder eingeben", Order = 1)]
    public required string ArticleNumber { get; init; }

    [Required]
    [OptionsFrom("warehouses")]
    [Field(Label = "Lager", Order = 2)]
    public required string Warehouse { get; init; }

    [Range(0.0001, double.MaxValue)]
    [Field(Label = "Menge", Order = 3)]
    public decimal Quantity { get; init; }

    [Multiline(Rows = 3)]
    [StringLength(500)]
    [Field(Label = "Grund", Placeholder = "z. B. Bruch, Schwund, Korrektur", Order = 4)]
    public string? Reason { get; init; }
}
Element Wirkung
Property-Typ string wird Textfeld, Zahlen werden Zahlenfelder, bool wird Schalter, Datumstypen erhalten einen Picker
[Field] Beschriftung, Platzhalter, Reihenfolge, Hilfetext
[Barcode] Bevorzugter Fokus für Scanner mit Tastatureingabe
[Multiline] Mehrzeiliges Textfeld mit fester Zeilenzahl
[Required], [Range], [StringLength] Prüfung im Browser und auf dem Server
[DefaultValue] Vorbelegung des Feldes
[Options] Feste Auswahlliste, direkt am Attribut angegeben
[OptionsFrom] Auswahlliste aus einem Options-Provider, aufgelöst beim Anzeigen des Formulars

Die Validierung erfolgt im Formular und vor der Ausführung auf dem Server.

Dynamische Auswahllisten bereitstellen

[OptionsFrom] lädt Auswahlwerte über einen [OptionsProvider], etwa aus microtech-ERP-Stammdaten:

[OptionsProvider("warehouses")]
public IReadOnlyList<FieldOption> GetWarehouses(
    CancellationToken cancellationToken)
{
    cancellationToken.ThrowIfCancellationRequested();

    return session.QueryDataSet<Lager>(includes: ["LagNr", "Bez"])
        .AsEnumerable()
        .Where(lager => !string.IsNullOrWhiteSpace(lager.LagNr))
        .GroupBy(lager => lager.LagNr, StringComparer.Ordinal)
        .Select(group => new FieldOption(
            group.Key!,
            $"{group.Key} {group.First().Bez}"))
        .OrderBy(option => option.Value, StringComparer.Ordinal)
        .ToList();
}

OptionsFrom und OptionsProvider verwenden dieselbe ID. Die Werte werden beim Öffnen des Formulars geladen.

Für feste Werte verwenden Sie [Options("1", "2", "3")].

Actions im Portal ausblenden

Mit Form = false unterdrücken Sie das generierte Formular, etwa für reine HTTP-Endpunkte. Das ersetzt keine Zugriffskontrolle:

[Action("list-artikel", Display = "Artikel auflisten", Form = false)]
public List<ArtikelRow> ListArtikel() { ... }