Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Table of Contents
stylenone

Eine Klasse kann verschiedene Aktionen beinhalten welche im Kontext der Entität ausgeführt werden können.

...

Methode

Beschreibung

Body<Person, PersonService>((person, service) => service.Execute(person))

Der PersonService wird über den IoC ausgelöst und die Aktion Execute mit der aktuellen Person ausgeführt.

Body<List<Person>, PersonService>((people, service) => service.Execute(people))

Der PersonService wird über den IoC ausgelöst und die Aktion Execute mit der aktuellen Liste von Personen ausgeführt.

Diese Aktion ist hilfreich wenn eine Aktion z.B. auch auf einer Selektion von Objekten ausgeführt werden kann.

Body<PersonService>((personService) => personService.Execute)

Direkte Zuweisung eines Delegate. Die Signatur der Methode muss dabei einen Parameter vom Typ IDataObject oder einer Ableitung davon zur Verfügung stellen.

Body<Person, PersonService>()

Der PersonService muss das Interface IActionAware<in IDataObject> implementieren. Der PersonService selbst wird über den IoC aufgelöst.

...

Soll zusätzlich zur Rückmeldung noch eine Navigation erfolgen so kann die Klasse NavigationLinkActionResult verwendet werden. Der NavigationLinkAspect muss dabei als Parameter zur Verfügung gestellt werden.

Aktionen auf Listen

Die oben beschriebenen Aktionen können auch auf Listen eingebunden werden. Dazu steht ein Overload zur Verfügung welcher eine Liste von Objekten zur Verfügung stellt. Dies kann hilfreich sein wenn eine Aktion z.B. auf eine Selektion von Objekten ausgeführt wird und nur ein Resultat erwartet wird.

Wird eine Aktion auf eine Liste von Objekten ausgeführt aber nur eine Methode unterstützt die Einzelobjekte behandelt so wird das letzte Resultat dem Client zurückgegeben und die restlichen verworfen.

Info

Wenn Aktionen auf mehreren Objekten ausgeführt werden können so wird empfohlen immer eine Liste von Objekten zu unterstützen.

Aktionen mit Parameter

Einige Aktionen erfordern eine Eingabe um erfolgreich ausgeführt werden zu können.

...

Eine so definierte Aktion kann nur von einem User ausgeführt werden welcher über “Create” Berechtigung auf der Entität verfügt.

Erweiterte Einschränkungen zur Ausführung können über den optionalen Parameter “expression” gemacht werden. Dieser erlaubt es eine Expression zu definieren welche evaluiert wird und die Ausführung verhindert wenn diese nicht auf “true” evaluiert.

Code Block
      Elements.Person.Add.Action("SampleAction")
        .PermissionRequired(GenericOperation.Create, "Aktiv == true");

Die beiden Permission Möglichkeiten lassen sich auch kombinieren. In diesem Falle muss der User sowohl die Berechtigung auf die Entität haben als auch die Expression erfüllt sein.

Code Block
      Elements.Person.Add.Action("SampleAction")
        .PermissionRequired("Aktiv == true");

Bei der Ausführung auf einer Klasse ohne spezifisches Objekt wird die Expression ebenfalls evaluiert. Kann diese nicht evaluiert werden wird ein entsprechender Log-Eintrag generiert und die Aktion trotzdem ausgeführt.

Die Ausführung auf einer Liste wird die Expression für alle Entitäten evaluieren und nur diejenigen ausführen die ein gültiges Resultat liefern. Dem Benutzer wird eine entsprechender Fehler angezeigt falls nur ein Teil der Aktionen ausgeführt werden konnte.

Erweiterte Restriktionen müssen aktuell die nicht über Expressions oder die Berechtigungen modelliert werden können müssen in der Aktion selbst implementiert werden.

Resultate

Das Resultat einer Aktion ist grundsätzlich frei wählbar. Standardmässig werden aber die MetaActionResult unterstützt und vom Client interpretiert.

Damit das zusammenstellen dieses Resultat etwas einfacher ist kann der MetaActionResultBuilder verwendet werden.

Code Block
languagec#
    var result = MetaActionResult.Builder()
      .WithChanges(MetaActionChanges.CallingObject)
      .WithAbsoluteNavigation("https://encodo.ch", OpenInTarget.Popup)
      .WithFeedback(MetaActionFeedbackType.Warning, new DynamicString(("en", "Custom Message")))
      .Build();

Dies produziert ein Resultat welches zur angegebenen Website navigiert.

Es stehen weitere Signaturen für eine Objekt-Navigation und Klassen-Navigation (Liste) zur Verfügung. Auch kann übersteuert werden welche Objekte sich geändert haben und was für ein Feedback genau gegeben werden soll.