2

ASP.NET MVC 4 アプリケーションでは、モデルの 1 つに DateTime 型のフィールドがあります。このようなモデル オブジェクトをフォームで編集する場合、DateTime フィールドの値は空ではなく、フォーマットに従う必要がありますyyyy-MM-dd H:mm:ss(例: 2012-10-17 10:49:00)。このフィールドがアプリケーションで正しく検証されるようにするにはどうすればよいですか? 次の注釈を試しました。

[System.ComponentModel.DataAnnotations.Required]
[System.ComponentModel.DataAnnotations.DisplayFormat(DataFormatString="yyyy-MM-dd H:mm:ss",
        ApplyFormatInEditMode=true)]

ただし、フォーム データの検証では、形式のすべてのコンポーネントが存在する必要はありません。たとえば、「2012-10-17」という値は受け入れられます (「H:mm:ss」の部分は除外されます)。フィールドに有効な DateTime 文字列が含まれていることが確認されただけです。

この DateTime フィールドが実際に指定した形式 (yyyy-MM-dd H:mm:ss) であることを確認するにはどうすればよいですか?

4

2 に答える 2

1

代替ソリューション - 表示専用モデル クラス

Darin のソリューションはもちろん有効ですが、使用できるのはそれだけではありません。また、ここで紹介するこのソリューションよりも複雑なコードを記述する必要があります。

したがって、これは代替手段です。カスタム モデル バインダーを作成する代わりに、必要に応じて複雑な検証正規表現を設定できる場所をDateTime取る代わりに、別のビュー モデル クラスを作成することをお勧めします。stringそして、それをアプリケーション/ドメイン モデル クラス インスタンスに変換する (およびその逆に変換する) メソッドを用意します。

// suppose this app model
public class User
{
    [Required]
    public string Name { get; set; }

    [Required]
    public DateTime DateOfBirth { get; set; }
}

public class ViewUser
{
    [Required]
    public string Name { get; set; }

    [Required]
    [RegularExpression("\d{4}-\d{2}-\d{2}(?:\s\d{1,2}:\d{2}:\d{2})?")]
    public string DateOfBirth { get; set; }

    public ViewUser(User user)
    {
        this.Name = user.Name;
        this.DateOfBirth = user.DateOfBirth.ToString("yyyy-MM-dd H:mm:ss");
    }

    public User ToPoco()
    {
        return new User {
            Name = this.Name,
            DateOfBirth = DateTime.Parse(this.DateOfBirth, "yyyy-MM-dd H:mm:ss")
        };
    }
}

少し調整することで、クラスViewUserから継承し、キーワード onを使用し、プロパティを使用して正しい型の値を格納できます。その場合、メソッドは必要ありません。UsernewDateOfBirthbaseToPoco

注:DateTime.TryParseExact日付には時間が含まれる場合と含まれない場合があるため、メソッドを使用して日付を解析する必要があります。日付入力の正確な要件に依存するため、コードには含めませんでした。

于 2012-10-17T10:00:01.393 に答える
0

DisplayFormat 属性で指定した正確な形式を使用するカスタム モデル バインダーを作成できます。でこれを実現する方法の例を示しましたthis post

また、DisplayFormat 属性が Required 属性をオーバーライドすると誤解しないでください。DisplayFormat は、入力フィールドにフィールドを表示するためにのみ使用されます。これは検証属性ではありません。検証とはまったく関係がなく、フォームがサーバーに POST されると、フォームは使用されません。

于 2012-10-17T09:27:02.457 に答える