2

私はC#でMVC 3を使用していますが、この属性を持つクラスがあります

[DisplayFormat(DataFormatString = "{0:dd MMM yyyy}", ApplyFormatInEditMode = true)]

ユーザーがいるときに検証を実施したいEDIT MODE

データベース内のデータは、datetimeこのようにフォーマットされたタイプで保存されます

  6/15/2009 1:45:30 PM

このエラーが発生します

エラー文字列が正しい形式ではありません

問題は

DataFormatString = "{0:dd MMM yyyy}"

それを修正する方法はありますか?

4

2 に答える 2

6

この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プロパティを削除する必要があります。

于 2012-11-06T21:01:14.190 に答える
0

0:dd MMM yyyy06 JUN 2009の代わりに のような文字列が期待されます6/15/2009

エラーが発生したときに文字列をどのように入力していString Not in Correct Formatますか?

于 2012-11-06T20:04:11.377 に答える