このDisplayFormat
属性は文字通り、値を表示するためだけのものです。を設定するApplyFormatInEditMode
と、テキスト ボックス (編集用) に表示されるときにデータの内容にフォーマットが適用されるだけです。検証とは何の関係もありません。
指定した形式を使用して入力を検証する場合は、おそらく独自の を作成しValidationAttribute
、 を使用DateTime.ParseExact()
して、期待する形式を満たしていることを確認する必要があります。唯一の欠点は、作成しない限り、クライアント側の検証ロジックが付随しないことです。
私はこれを徹底的にテストしていませんが、それはあなたの出発点になるはずです.
public class DateTimeFormatAttribute : ValidationAttribute
{
public int Format { get; set; }
public override bool IsValid(object value)
{
if (value == null)
return true;
DateTime val;
try
{
val = DateTime.ParseExact(value.ToString(), Format, null);
}
catch(FormatException)
{
return false;
}
//Not entirely sure it'd ever reach this, but I need a return statement in all codepaths
return val != DateTime.MinValue;
}
}
あとは使い方次第です。
[DateTimeFormat(Format = "dd MMM yyyy")]
更新:申し訳ありませんが、あなたの質問をはっきりと読んでいないと思います。ポストバックのデータについて不平を言っているのは、使用しようとしている形式が標準のものではないためです。手動で編集したり、このような非標準の形式を期待したりするよりも、フィールドに入力するときに使用する一般的な日付ピッカーの 1 つをオンラインで実装する方がよい場合があります。カスタム表示形式は表示には最適ですが、編集モードにカスタム形式を使用する場合は、デフォルトのDateTime.Parse
独自の ModelBinder を作成する必要があることを理解していません。それは私が行ったことのないことです。代わりに、ビューモデルのデータ型を文字列に変更し、アクション メソッドで自分で解析することもできます (まだ可能です)。この場合は私が提供したバリデーターを使用してください)。エラーを取り除くには (ただし、編集モードではカスタム形式も削除されます)、ApplyFormatInEditMode
プロパティを削除する必要があります。