web-dev-qa-db-ja.com

データ注釈属性クラスを使用してフォームの空の文字列を失敗させる方法はありますか

フォームにテキスト入力フィールドを要求しようとしていました。これは、フォームに何かが必要であることを意味します。ただし、[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値を挿入しようとするとデータベースエラーがスローされます。

これらの属性を変更して、必要なように見えるようにするにはどうすればよいですか?

25
DCShannon

グーグルでたくさん調べて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; }
}    
63
DCShannon

このような新しい検証属性を実装し、モデルに適用します。

public class RequiredNotEmptyAttribute : RequiredAttribute
{
    public override bool IsValid(object value)
    {
        if(value is string) return String.IsNullOrEmpty((string)value);

        return base.IsValid(value);
    }
}

これはサーバー側でのみ機能します(クライアント側は引き続きnullのみをチェックします)。

5
Nathan A

デフォルト値を必要とするプロパティに DefaultValueAttribute を追加できます(UserNameのstring.Emptyなど)

[DisplayName("User Name")]
[System.ComponentModel.DefaultValue("")]
public string UserName { get; set; }
1
quantdev