2

Model Metadata クラスに次のプロパティがあります。

[Required(ErrorMessage = "Spent On is required")]
[RegularExpression(@"[0-1][0-9]/[0-3][0-9]/20[12][0-9]", 
   ErrorMessage = "Please enter date in mm/dd/yyyy format")]
[DataType(DataType.Date)]
[DisplayName("Spent On")]
public DateTime SpentOn { get; set; }

しかし、正規表現が検証されていないため、呼び出すたびにModelState.IsValid常に false が返されます。同じパターンを使用して、入力した日付 (2010 年 8 月 29 日) を新しい正規表現と照合したところ、完全に一致しました。

私は何を間違っていますか?

4

2 に答える 2

4

実は、これには別の回避策があります。RegularExpressionAttribute を単純にサブクラス化できます

public class DateFormatValidatorAttribute : RegularExpressionAttribute {
    public DateFormatValidatorAttribute()
        : base(@"[0-1][0-9]/[0-3][0-9]/20[12][0-9]") 
        {
            ErrorMessage = "Please enter date in mm/dd/yyyy format";
        }

        public override bool IsValid(object value) {
            return true;
        }
}

アプリケーションの開始時に Global.asax.cs で、クライアント側の検証用に RegularExpression アダプターを次のように登録します。

DataAnnotationsModelValidatorProvider.RegisterAdapter(
            typeof(DateFormatValidatorAttribute), 
                typeof(RegularExpressionAttributeAdapter));

これで、ビルトイン MVC 正規表現バリデーター クライアント側を取得し、DateTime をプロパティ タイプとして保持することができます。

于 2010-11-24T15:31:13.620 に答える
2

これは、正規表現がDateTimeプロパティではなく文字列に適用されるためです。DateTimeユーザーがモデルバインダーからインスタンスに解析できない無効な文字列を入力すると、正規表現パターンが実行される前に一般的なエラーメッセージが追加されます。

いくつかの可能性があります。

  1. リソースファイルのエラーメッセージをカスタマイズする
  2. カスタムモデルバインダーを書く
  3. 文字列プロパティを使用します(これを提案することに罪悪感を感じます:-))
于 2010-08-29T11:19:56.983 に答える