Suche…


DisplayNameAttribute (Anzeigeattribut)

DisplayName legt den Anzeigenamen für eine Eigenschafts-, Ereignis- oder öffentliche Void-Methode mit null (0) Argumenten fest.

public class Employee
{
    [DisplayName(@"Employee first name")]
    public string FirstName { get; set; }
}

Einfaches Anwendungsbeispiel in der XAML-Anwendung

<Window x:Class="WpfApplication.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:wpfApplication="clr-namespace:WpfApplication"
        Height="100" Width="360" Title="Display name example">

    <Window.Resources>
        <wpfApplication:DisplayNameConverter x:Key="DisplayNameConverter"/>
    </Window.Resources>

    <StackPanel Margin="5">
        <!-- Label (DisplayName attribute) -->
        <Label Content="{Binding Employee, Converter={StaticResource DisplayNameConverter}, ConverterParameter=FirstName}" />
        <!-- TextBox (FirstName property value) -->
        <TextBox Text="{Binding Employee.FirstName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
    </StackPanel>
    
</Window>

namespace WpfApplication
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        private Employee _employee = new Employee();

        public MainWindow()
        {
            InitializeComponent();
            DataContext = this;
        }

        public Employee Employee
        {
            get { return _employee; }
            set { _employee = value; }
        }
    }
}

namespace WpfApplication
{
    public class DisplayNameConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            // Get display name for given instance type and property name
            var attribute = value.GetType()
                .GetProperty(parameter.ToString())
                .GetCustomAttributes(false)
                .OfType<DisplayNameAttribute>()
                .FirstOrDefault();

            return attribute != null ? attribute.DisplayName : string.Empty;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
}

Geben Sie hier die Bildbeschreibung ein

EditableAttribute (Datenmodellierungsattribut)

EditableAttribute legt fest, ob Benutzer den Wert der Klasseneigenschaft ändern können sollen.

public class Employee
{
    [Editable(false)]
    public string FirstName { get; set; }
}

Einfaches Anwendungsbeispiel in der XAML-Anwendung

<Window x:Class="WpfApplication.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:wpfApplication="clr-namespace:WpfApplication"
        Height="70" Width="360" Title="Display name example">

    <Window.Resources>
        <wpfApplication:EditableConverter x:Key="EditableConverter"/>
    </Window.Resources>

    <StackPanel Margin="5">
        <!-- TextBox Text (FirstName property value) -->
        <!-- TextBox IsEnabled (Editable attribute) -->
        <TextBox Text="{Binding Employee.FirstName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
                 IsEnabled="{Binding Employee, Converter={StaticResource EditableConverter}, ConverterParameter=FirstName}"/>
    </StackPanel>
    
</Window>

namespace WpfApplication
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        private Employee _employee = new Employee() { FirstName = "This is not editable"};

        public MainWindow()
        {
            InitializeComponent();
            DataContext = this;
        }

        public Employee Employee
        {
            get { return _employee; }
            set { _employee = value; }
        }
    }
}

namespace WpfApplication
{
    public class EditableConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            // return editable attribute's value for given instance property,
            // defaults to true if not found
            var attribute = value.GetType()
                .GetProperty(parameter.ToString())
                .GetCustomAttributes(false)
                .OfType<EditableAttribute>()
                .FirstOrDefault();

            return attribute != null ? attribute.AllowEdit : true;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
}

bearbeitbar

Validierungsattribute

Validierungsattribute werden verwendet, um verschiedene Validierungsregeln deklarativ für Klassen oder Klassenmitglieder durchzusetzen. Alle Validierungsattribute werden von der ValidationAttribute- Basisklasse abgeleitet.


Beispiel: RequiredAttribute

Bei der Validierung durch die ValidationAttribute.Validate Methode gibt dieses Attribut einen Fehler zurück, wenn die Name Eigenschaft null ist oder nur Leerzeichen enthält.

public class ContactModel
{
    [Required(ErrorMessage = "Please provide a name.")]
    public string Name { get; set; }
}

Beispiel: StringLengthAttribute

Das StringLengthAttribute , ob eine Zeichenfolge kleiner als die maximale Länge einer Zeichenfolge ist. Optional kann eine Mindestlänge angegeben werden. Beide Werte sind inklusive.

public class ContactModel
{
    [StringLength(20, MinimumLength = 5, ErrorMessage = "A name must be between five and twenty characters.")]
    public string Name { get; set; }
}

Beispiel: RangeAttribute

Das RangeAttribute gibt den maximalen und minimalen Wert für ein numerisches Feld an.

public class Model
{
    [Range(0.01, 100.00,ErrorMessage = "Price must be between 0.01 and 100.00")]
    public decimal Price { get; set; }
}

Beispiel: CustomValidationAttribute

Mit der CustomValidationAttribute Klasse kann eine benutzerdefinierte static Methode zur Überprüfung aufgerufen werden. Die benutzerdefinierte Methode muss static ValidationResult [MethodName] (object input) .

public class Model
{
    [CustomValidation(typeof(MyCustomValidation), "IsNotAnApple")]
    public string FavoriteFruit { get; set; }
}

Methodendeklaration:

public static class MyCustomValidation
{
    public static ValidationResult IsNotAnApple(object input)
    {
        var result = ValidationResult.Success;

        if (input?.ToString()?.ToUpperInvariant() == "APPLE")
        {
            result = new ValidationResult("Apples are not allowed.");
        }

        return result;
    }
}

Angepasstes Validierungsattribut erstellen

Benutzerdefinierte Validierungsattribute können erstellt werden, indem sie von der ValidationAttribute Basisklasse abgeleitet und anschließend bei Bedarf virtual Methoden überschrieben werden.

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = false)]
public class NotABananaAttribute : ValidationAttribute
{
    public override bool IsValid(object value)
    {
        var inputValue = value as string;
        var isValid = true;

        if (!string.IsNullOrEmpty(inputValue))
        {
            isValid = inputValue.ToUpperInvariant() != "BANANA";
        }

        return isValid;
    }
}

Dieses Attribut kann dann wie folgt verwendet werden:

public class Model
{
    [NotABanana(ErrorMessage = "Bananas are not allowed.")]
    public string FavoriteFruit { get; set; }
}

Grundlagen der Datenanmerkungen

Datenanmerkungen sind eine Möglichkeit, Klassen oder Member einer Klasse mit mehr Kontextinformationen zu versehen. Es gibt drei Hauptkategorien von Anmerkungen:

  • Validierungsattribute: Hinzufügen von Validierungskriterien zu Daten
  • Attribute anzeigen: Geben Sie an, wie die Daten dem Benutzer angezeigt werden sollen
  • Modellierungsattribute: Fügen Sie Informationen zur Verwendung und Beziehung zu anderen Klassen hinzu

Verwendungszweck

Hier ist ein Beispiel, bei dem zwei ValidationAttribute und ein DisplayAttribute verwendet werden:

class Kid
{
    [Range(0, 18)] // The age cannot be over 18 and cannot be negative
    public int Age { get; set; }
    [StringLength(MaximumLength = 50, MinimumLength = 3)] // The name cannot be under 3 chars or more than 50 chars
    public string Name { get; set; }
    [DataType(DataType.Date)] // The birthday will be displayed as a date only (without the time)
    public DateTime Birthday { get; set; }
}

Datenanmerkungen werden meist in Frameworks wie ASP.NET verwendet. Wenn zum Beispiel in ASP.NET MVC ein Modell von einer Controller-Methode empfangen wird, kann mit ModelState.IsValid() festgestellt werden, ob das empfangene Modell alle seine ValidationAttribute ModelState.IsValid() . DisplayAttribute wird auch in ASP.NET MVC , um zu bestimmen, wie Werte auf einer Webseite angezeigt werden.

Validierungsattribute manuell ausführen

In den meisten Fällen werden Validierungsattribute in Frameworks (z. B. ASP.NET) verwendet. Diese Frameworks sorgen für die Ausführung der Validierungsattribute. Was aber, wenn Sie Validierungsattribute manuell ausführen möchten? Verwenden Sie einfach die Validator Klasse (keine Reflektion erforderlich).

Validierungskontext

Jede Validierung benötigt einen Kontext, um Informationen darüber zu erhalten, was geprüft wird. Dazu können verschiedene Informationen gehören, z. B. das zu überprüfende Objekt, einige Eigenschaften, der Name, der in der Fehlermeldung angezeigt werden soll usw.

ValidationContext vc = new ValidationContext(objectToValidate); // The simplest form of validation context. It contains only a reference to the object being validated.

Nachdem der Kontext erstellt wurde, gibt es mehrere Möglichkeiten, die Validierung durchzuführen.

Überprüfen Sie ein Objekt und alle seine Eigenschaften

ICollection<ValidationResult> results = new List<ValidationResult>(); // Will contain the results of the validation
bool isValid = Validator.TryValidateObject(objectToValidate, vc, results, true); // Validates the object and its properties using the previously created context.
// The variable isValid will be true if everything is valid
// The results variable contains the results of the validation

Bestätigen Sie eine Eigenschaft eines Objekts

ICollection<ValidationResult> results = new List<ValidationResult>(); // Will contain the results of the validation
bool isValid = Validator.TryValidatePropery(objectToValidate.PropertyToValidate, vc, results, true); // Validates the property using the previously created context.
// The variable isValid will be true if everything is valid
// The results variable contains the results of the validation

Und mehr

Weitere Informationen zur manuellen Validierung finden Sie unter:



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow