ASP.NET CoreのDataAnotation


## モデル値の検証に関する属性

### StringLength 属性


```c#
[StringLength(50, ErrorMessage = "50文字以内で入力してください")]
```

StringLength 属性は、データフィールドで使用できる最小文字長と最大文字長を指定します。上の例では、使用可能な文字数が 50 文字以下に制限されます。

ErrorMessageプロパティは、これ以外の検証属性でも利用できますが、これ以降は省略します。 

以下のようにのように、MinimumLength を指定することで、文字列の最小長を設定することもできます。ただし、Required 属性も指定しないと、空文字を制限することはできません。


```c#
[StringLength(50, MinimumLength=2)]
```


### RegularExpression 属性


```c#
[RegularExpression(@"^[A-Z][a-zA-Z0-9]+$")]
```


RegularExpression 属性は、正規表現を使った入力検証を行うことができます。


### Required 属性


```c#
[Required]
```

Required 属性は、必須フィールドを示す属性です。参照型のプロパティに指定します。
値型 (例: DateTime、int、double) などの null 非許容型では、Required 属性は必要ありません。 自動的に必須フィールドとして扱われます。


以下のようにすることで、null は非許容だけど、空文字列をデータベースに入れることができます。

```c#
[Required(AllowEmptyStrings = true)] 
```

### Range 属性

```c#
[Range(0, 5)]
```

持ちうる値の範囲を指定します。double型を指定することも可能です。

また、以下のようにすれば、日付の範囲を指定することも可能です。

```c#
[Range(typeof(DateTime), "1/2/2004", "3/4/2004",
```

### Compare 属性

```c#
[Compare("Password", ErrorMessage = "パスワードが一致しません")]
public string PasswordConfirm { get; set; }
```

2つのプロパティが一致するかを検証します。上の例は、PasswordConfirmプロパティの値とPasswordプロパティの値が一致する必要があります。


### EmailAddress 属性

```c#
[EmailAddress]

```

電子メール アドレスであるかを検証します。


### Phone 属性

```c#
[Phone]

```

電話番号であるかを検証します。


### CreditCard 属性

```c#
[CreditCard]

```

クレジットカード番号であるかを検証します。


## 表示/入力に関する属性

### Display 属性

```c#
[Display(Name = "Last Name")]
```

Display属性は、ラベルのキャプションを指定する際に利用します。


### DisplayFormat 属性

DisplayFormat属性は、書式を明示的に指定するために使用されます。

```c#
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
```

ApplyFormatInEditMode オプションは、書式設定を編集 UI にも適用する必要があることを指定します。

DisplayFormat 属性は単独で使用できます。 一般的には、DataType 属性を DisplayFormat 属性と一緒に使用することが推奨されています。

以下のように書けば、nullの時に表示する値を指定できます。


```c#
[DisplayFormat(NullDisplayText = "未指定")]
```

次の例は、空の文字列値を null 値に変換せずに、空文字のまま扱うことを指定します。


```c#
[DisplayFormat(ConvertEmptyStringToNull = false)] 
```



### DataType 属性


DataType 属性は、ビューエンジンに対して、データの書式設定のヒントを提供します。プロパティの型よりも詳しい型を指定したいときに利用します。検証は行われませんが、HTML5の機能により、結果的に検証と同等の働きが組み込まれることがあります。


```c#
[DataType(DataType.Date)]
```

DataType 属性は、HTML 5 の data- (データ ダッシュと読みます) 属性が出力されます。 DataType 属性では検証は提供されません。

DataType 列挙型は、Date、Time、PhoneNumber、Currency、EmailAddress など、多くのデータ型のために用意されています。

次のような書けば、パスワードを入力するフィールドであることを指定できます。この場合は、入力タグヘルパーにより、`type="password"` 属性が付加されます。


```c#
[DataType(DataType.Password)]
```

### HiddenInput属性

隠しフィールドであることを示します。入力タグヘルパーにより、`type="hidden"`がinput要素に付加されます。


```c#
[HiddenInput]
```


## データベースに関する属性

### Column 属性


```c#
[Column("FirstName")]
public string FirstMidName { get; set; }
```


このように書けば、テーブルのカラム名をプロパティ名とは別のものに変更できる。

以下のように、データベースのカラムの詳細な型を指定することもできます。

```c#
[Column(TypeName = "decimal(18, 2)")]
```


### Key 属性

```c#
[Key]
```

[Key] 属性は、プロパティ名が `<classname>Id` や `Id` 以外の時に、そのプロパティが主キー (PK) であることを示すために使用します。


### DatabaseGenerated 属性

```c#
[DatabaseGenerated(DatabaseGeneratedOption.None)] 
```

上のコードはPKの値をデータベースで自動生成するのではなく、アプリケーション側で指定することを示します。



### TimeStamp 属性

```c#
[Timestamp]
public byte[] RowVersion { get; set; }
```


オプティミスティック コンカレンシーのチェックに利用されるフィールドであることを示します。
SQL Serverでは、rowversion型が割り当てられます。


## 属性に関するその他の情報


以下のように、複数の属性を 1行に配置することができます。

```c#
[DataType(DataType.Date),Display(Name = "Hire Date"),DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
```