C# Language
Аннотации данных
Поиск…
DisplayNameAttribute (атрибут отображения)
DisplayName
устанавливает отображаемое имя для свойства, события или общедоступного метода void с нулевыми (0) аргументами.
public class Employee
{
[DisplayName(@"Employee first name")]
public string FirstName { get; set; }
}
Простой пример использования в приложении XAML
<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();
}
}
}
EditableAttribute (атрибут моделирования данных)
EditableAttribute
устанавливает, должны ли пользователи изменять значение свойства класса.
public class Employee
{
[Editable(false)]
public string FirstName { get; set; }
}
Простой пример использования в приложении XAML
<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();
}
}
}
Атрибуты проверки
Атрибуты проверки используются для принудительного применения различных правил проверки в декларативном виде для классов или членов класса. Все атрибуты проверки основаны на базовом классе ValidationAttribute .
Пример: RequiredAttribute
При проверке с помощью метода ValidationAttribute.Validate
этот атрибут возвращает ошибку, если свойство Name
равно null или содержит только пробелы.
public class ContactModel
{
[Required(ErrorMessage = "Please provide a name.")]
public string Name { get; set; }
}
Пример: StringLengthAttribute
StringLengthAttribute
проверяет, StringLengthAttribute
ли строка, чем максимальная длина строки. Он может дополнительно указать минимальную длину. Оба значения включены.
public class ContactModel
{
[StringLength(20, MinimumLength = 5, ErrorMessage = "A name must be between five and twenty characters.")]
public string Name { get; set; }
}
Пример: RangeAttribute
RangeAttribute
дает максимальное и минимальное значение для числового поля.
public class Model
{
[Range(0.01, 100.00,ErrorMessage = "Price must be between 0.01 and 100.00")]
public decimal Price { get; set; }
}
Пример: CustomValidationAttribute
Класс CustomValidationAttribute
позволяет использовать специальный static
метод для проверки. Пользовательский метод должен быть static ValidationResult [MethodName] (object input)
.
public class Model
{
[CustomValidation(typeof(MyCustomValidation), "IsNotAnApple")]
public string FavoriteFruit { get; set; }
}
Объявление метода:
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;
}
}
Создание настраиваемого атрибута проверки
Пользовательские атрибуты проверки могут быть созданы путем получения базового класса ValidationAttribute
и последующего переопределения virtual
методов по мере необходимости.
[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;
}
}
Затем этот атрибут можно использовать следующим образом:
public class Model
{
[NotABanana(ErrorMessage = "Bananas are not allowed.")]
public string FavoriteFruit { get; set; }
}
Основы аннотаций данных
Аннотации данных - это способ добавления дополнительной контекстной информации к классам или членам класса. Существуют три основные категории аннотаций:
- Атрибуты проверки: добавить критерии проверки данных
- Атрибуты отображения: укажите, как данные должны отображаться пользователю
- Атрибуты моделирования: добавьте информацию об использовании и отношениях с другими классами
использование
Вот пример, в котором используются два параметра ValidationAttribute
и один DisplayAttribute
:
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; }
}
Аннотации данных в основном используются в таких рамках, как ASP.NET. Например, в ASP.NET MVC
, когда модель получена методом контроллера, ModelState.IsValid()
может использоваться, чтобы определить, соответствует ли полученная модель всему ее ValidationAttribute
. DisplayAttribute
также используется в ASP.NET MVC
для определения способа отображения значений на веб-странице.
Вручную выполнять атрибуты проверки
В большинстве случаев атрибуты проверки используются внутри фреймворков (например, ASP.NET). Эти рамки заботятся о выполнении атрибутов проверки. Но что, если вы хотите вручную выполнить атрибуты проверки? Просто используйте класс Validator
(не требуется никакого отражения).
Контекст проверки
Любая проверка требует контекста, чтобы дать некоторую информацию о том, что проверяется. Это может включать в себя различную информацию, такую как проверяемый объект, некоторые свойства, имя для отображения в сообщении об ошибке и т. Д.
ValidationContext vc = new ValidationContext(objectToValidate); // The simplest form of validation context. It contains only a reference to the object being validated.
После создания контекста существует несколько способов проверки.
Проверка объекта и всех его свойств
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
Проверка свойства объекта
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
И больше
Подробнее о ручной проверке см. В: