フォームにテキスト入力フィールドを要求しようとしていました。これは、フォームに何かが必要であることを意味します。ただし、[Required]
私のモデルのタグが機能していませんでした。具体的には、ユーザー名プロパティを見てください。
public class ColumnWidthMetaData {
[DisplayName("Column Name")]
[Required]
public string ColName { get; set; }
[DisplayName("Primary Key")]
public int pKey { get; set; }
[DisplayName("User Name")]
[Required]
public string UserName { get; set; }
[DisplayName("Column Width")]
[Required]
public int Width { get; set; }
}
これにより、空の文字列で過去のモデル検証を取得でき、最終的にユーザー名にNULL値を挿入しようとするとデータベースエラーがスローされます。
これらの属性を変更して、必要なように見えるようにするにはどうすればよいですか?
グーグルでたくさん調べてStackoverflowを調べたところ、何もありませんでした。
MSDNにアクセスして、 System.ComponentModel.DataAnnotations名前空間 を見ました。
そこでRequired
属性をより詳しく見てみると、 AllowEmptyStrings
property に気付きました。これをfalse
に設定すると、空の文字列を許可しないように属性に指示します。これは、Required
のポイントが何かを入力することを要求する方法として、デフォルトの動作であると想定します。空の文字列は、何も入力されなかったことを示します。
ただし、デフォルトでは空の文字列はnull
に強制されます。これは空の文字列ではないため、許可されます。 Required
は何かが入力されたかどうかをテストすることになっており、null
は何も入力されていないことを示しているため、これもばかげています。ただし、AllowEmptyStrings
ページにはDisplayFormAttribute
のプロパティ ConvertEmptyStringsToNull
へのリンクがあります。これをfalse
に設定すると、空の文字列は空の文字列のままになり、必要なタグはそれらを許可しません。
だから、ここに修正があります:
public class ColumnWidthMetaData {
[DisplayName("Column Name")]
[Required(AllowEmptyStrings=false)]
[DisplayFormat(ConvertEmptyStringToNull=false)]
public string ColName { get; set; }
[DisplayName("Primary Key")]
public int pKey { get; set; }
[DisplayName("User Name")]
[Required(AllowEmptyStrings=false)]
[DisplayFormat(ConvertEmptyStringToNull=false)]
public string UserName { get; set; }
[DisplayName("Column Width")]
[Required]
public int Width { get; set; }
}
このような新しい検証属性を実装し、モデルに適用します。
public class RequiredNotEmptyAttribute : RequiredAttribute
{
public override bool IsValid(object value)
{
if(value is string) return String.IsNullOrEmpty((string)value);
return base.IsValid(value);
}
}
これはサーバー側でのみ機能します(クライアント側は引き続きnullのみをチェックします)。
デフォルト値を必要とするプロパティに DefaultValueAttribute を追加できます(UserNameのstring.Emptyなど)
[DisplayName("User Name")]
[System.ComponentModel.DefaultValue("")]
public string UserName { get; set; }