サーチ…
DisplayNameAttribute(表示属性)
DisplayName
は、引数が0のプロパティ、イベント、またはpublic voidメソッドの表示名を設定します。
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
メソッドによってValidationAttribute.Validate
れると、 Name
プロパティがnullまたは空白のみを含む場合、この属性はエラーを返します。
public class ContactModel
{
[Required(ErrorMessage = "Please provide a name.")]
public string Name { get; set; }
}
例: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
は、数値フィールドの最大値と最小値を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; }
}
データアノテーションの基礎
データ注釈は、クラスまたはクラスのメンバーにコンテキスト情報を追加する方法です。注釈の主なカテゴリは3つあります。
- 検証属性:データに検証基準を追加する
- 表示属性:ユーザーにデータを表示する方法を指定する
- モデル化属性:他のクラスとの使用法や関係に関する情報を追加する
使用法
2つのValidationAttribute
と1つの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
Webページに値を表示する方法を決定するためにも使用されます。
検証属性を手動で実行する
ほとんどの場合、検証属性はフレームワーク(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
もっと
手動検証の詳細については、以下を参照してください。