Komponentenparameter sollten als auto-properties deklariert werden, was
das bedeutet Sie sollten keine benutzerdefinierte Logik in ihren Get- oder Set-Accessoren enthalten. Beispielsweise ist die folgende StartData-Eigenschaft eine
automatische Eigenschaft:
Code: Select all
[Parameter] public DateTime StartData { get; set; }
Nun, das ist das Dogma, weil ich keine Rechtfertigung sehe.
Ich stimme zu, dass es nicht das Komplizierte geben darf Logik, aber es gibt den wichtigen Fall, in dem die einfache Logik sein muss - Es ist die Validierung.
Beispiel
Der Wert des theme-Parameters der AdmonitionBlock-Komponente muss entweder das Element von sein StandardThemes-Enumeration oder das Element der CustomThemes-Enumeration, das vor der Verwendung der AdmonitionBlock-Komponente über die Methode defineThemes definiert werden muss:
Code: Select all
public partial class AdmonitionBlock : Microsoft.AspNetCore.Components.ComponentBase
{
public static string CSS_NAMESPACE = "AdmonitionBlock";
public enum StandardThemes { regular }
protected internal static Type? CustomThemes;
public static void defineThemes(Type CustomThemes)
{
YDF_ComponentsHelper.ValidateCustomTheme(CustomThemes);
AdmonitionBlock.CustomThemes = CustomThemes;
}
protected string _theme = AdmonitionBlock.StandardThemes.regular.ToString();
[Microsoft.AspNetCore.Components.Parameter]
public object theme
{
get => this._theme;
set => YDF_ComponentsHelper.
AssignThemeIfItIsValid(value, AdmonitionBlock.CustomThemes, ref this._theme);
}
protected internal static bool mustConsiderThemesCSS_ClassesAsCommon = YDF_ComponentsHelper.areThemesCSS_ClassesCommon;
public static void considerThemesAsCommon()
{
AdmonitionBlock.mustConsiderThemesCSS_ClassesAsCommon = true;
}
[Microsoft.AspNetCore.Components.Parameter]
public bool areThemesCSS_ClassesCommon { get; set; } =
YDF_ComponentsHelper.areThemesCSS_ClassesCommon || AdmonitionBlock.mustConsiderThemesCSS_ClassesAsCommon;
}
Code: Select all
public abstract class ComponentsHelper
{
public static bool areThemesCSS_ClassesCommon = false;
public static void ValidateCustomTheme(Type CustomThemes)
{
if (!CustomThemes.IsEnum)
{
throw new CustomYDF_ThemeIsNotEnumerationException();
}
}
public static void AssignThemeIfItIsValid(object value, Type? customThemes, ref string _theme)
{
if (value is TStandardThemes standardTheme)
{
_theme = $"{ standardTheme }";
return;
}
string stringifiedThemeValue = value.ToString() ?? "";
if (customThemes is not null)
{
Type customThemesType = customThemes;
if (customThemesType.IsEnum && Enum.GetNames(customThemesType).Contains(stringifiedThemeValue))
{
_theme = stringifiedThemeValue;
return;
}
}
throw new InvalidThemeParameterForYDF_ComponentException();
}
}
Den Ratschlägen folgend, habe ich das Thema in eine automatische Eigenschaft umgewandelt und die SetParametersAsync-Methode hinzugefügt:
Code: Select all
public partial class AdmonitionBlock : Microsoft.AspNetCore.Components.ComponentBase
{
public enum StandardThemes { regular }
protected internal static Type? CustomThemes;
public static void defineThemes(Type CustomThemes)
{
ComponentsHelper.ValidateCustomTheme(CustomThemes);
AdmonitionBlock.CustomThemes = CustomThemes;
}
[Microsoft.AspNetCore.Components.Parameter]
public object theme { get; set; } = AdmonitionBlock.StandardThemes.regular;
public string themeName => this.theme.ToString() ?? "";
public override Task SetParametersAsync(Microsoft.AspNetCore.Components.ParameterView parameters)
{
parameters.SetParameterProperties(this);
if (parameters.TryGetValue(nameof(this.theme), out object? value))
{
ComponentsHelper.ValidateTheme(value, AdmonitionBlock.CustomThemes);
}
return base.SetParametersAsync(ParameterView.Empty);
}
}
Code: Select all
public abstract class ComponentsHelper
{
public static void ValidateTheme(object? value, Type? customThemes)
{
if (value is TStandardThemes standardTheme)
{
return;
}
string stringifiedThemeValue = value?.ToString() ?? "";
if (customThemes is not null)
{
Type customThemesType = customThemes;
if (customThemesType.IsEnum && Enum.GetNames(customThemesType).Contains(stringifiedThemeValue))
{
return;
}
}
throw new InvalidThemeParameterForYDF_ComponentException();
}
}