私のViewModelにDateTime MyDate
のプロパティがあります。ASP.NET MVC 3で特定の形式の日付を検証する
[DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode=true)]
[RegularExpression(@"^(([0-2]\d|[3][0-1])\.([0]\d|[1][0-2])\.[2][0]\d{2})$",
ErrorMessage="Failed...")]
public DateTime MyDate { get; set; }
ためのコントローラアクション署名HttpPostは、次のようになります。私は、次の属性をユーザーのみ(DD.MM.YYYY)特定の形式のテキストボックス内の日付部分に入ることを確認するとみましたこの:
@Html.TextBoxFor(model => model.MyDate)
:レイザービューで
@Html.EditorFor(model => model.MyDate)
[HttpPost]
public ActionResult Edit(int id, MyViewModel viewModel)
{
// MyViewModel contains the MyDate property ...
// ...
if (ModelState.IsValid)
{
// ...
}
// ...
}
は、私は、次の2つの方法を試してみました
私が望むように、それは動作しません。結果は次のとおりです。
- クライアント側の検証でも、正規表現を渡す「2011年6月17日」のような有効な日付で、動作します。
MyDate
プロパティは、入力された日付であるviewModel
に正しく入力され、アクションに渡されます。モデル結合が機能していたようです。 DisplayFormat
の属性は、EditorFor
でのみ尊重されますが、TextBoxFor
では拒否されません。TextBoxFor
ディスプレイ "DD.MM.YYYY HH:mm:ssの"
質問:
は私が
string
ない性質上、全くRegularExpressionAttribute
を適用することはできますか?もし許可されていれば、サーバ側でDateTime
のような文字列以外のプロパティに対してreg exがどのように評価されますか? reg exと比較してMyDate.ToString()
のようなものですか? (これは、ToStringメソッドは、正規表現を渡しません時刻部分を含む文字列を返しますので、検証が失敗したことを説明するだろう。)は、一般的にのみ
TextBoxFor
によってEditorFor
、決してによって尊敬DisplayFormat
属性ですか?どのように日付検証の権利を行うことができますか?
リンクをありがとうございます。今後の参考に利用できるようブックマークしました。しかし、私の問題はローカリゼーションとは関係ないと思います。私は正規表現が無視されているとは思わない:クライアント側の検証が動作し、サーバ側の検証もreg exで何かをする(ModelStateが言うように、このreg exに対して失敗する)。私はdevマシン(クライアントとサーバー=同じマシン)でテストしているので、ロケールは同じです。しかし、私はまた、reg exを使うのは間違っていると信じています(無視されません)。ユーザーが時間のない部分に日付を入力するだけであることをどのように検証しますか? – Slauma
@Slauma、これを同じマシンで試したという事実は、ブラウザとサーバーのカルチャ設定に違いがないことを意味するものではありません。時間の部分については、日付を入力する必要がある形式をユーザーに伝えるだけで、サーバー上ではアプリケーションに必要がない場合は時間部分を無視します。おそらくjqueryの日付ピッカーを提供して、ユーザーが日付を正しい形式で入力するのを簡単にするかもしれません。 –
あなたは正しいです、私はあまりにも複雑にしようとしています。今のところ、ユーザー入力のためのもう少しの助けとして、私は 'DateOnly'属性を作成しました(私自身の答えを見てください)。日付ピッカーは、ユーザーのためのより良いヘルプです!私は次のステップの1つとしてそれを試みます。 – Slauma