2012-03-22 12 views
0

日時が有効であることを確認する必要があります。日時データ注釈が機能しない

レイザーMVC3

クラス

[Range(typeof(DateTime), "1/1/1930", "1/1/2112", 
ErrorMessage = "Value for {0} must be between {1} and {2}")] 
public DateTime DOB { get; set; } 

編集ビューフォーム

<span class="editor-field"> 
@Html.EditorFor(model => model.DOB) 
@Html.ValidationMessageFor(model => model.DOB) 

検証が無効な日付をキャッチするが、有効な日付が入力されたときにエラーをクリアしないので、フォーム吊るされている。誰かが、Validationを使ってdatetimeが有効かどうかをチェックする作業方法を知っていますか?

おかげで、ジョー

更新コントローラーのアクション

[HttpPost] 
public ActionResult Create(Talent talent) 
{ 
    talent.Modified = talent.Created = DateTime.Now; 
    if (talent.DOB < DateTime.Now.AddYears(-100) || talent.DOB > DateTime.Now) 
    { 
    talent.DOB = DateTime.Parse("0001/01/01"); talent.Skill = "changed"; 
    return View(talent); } 

決勝コントローラとPostアクション

string errorMessageDOB = "DOB is out of range, it needs to be between " + DateTime.Now.AddYears(-100).ToShortDateString() 
    + " and " + DateTime.Now.ToShortDateString() + "."; 
// 
// POST: /Talent/Create 

[HttpPost] 
public ActionResult Create(Talent talent) 
{ 
    talent.Modified = talent.Created = DateTime.Now; 
    if (talent.DOB < DateTime.Now.AddYears(-100) || talent.DOB > DateTime.Now) 
    { ModelState.AddModelError(string.Empty, errorMessageDOB); } 

答えて

2

this articleに示すように、あなたは、カスタム検証属性を実装することができます。

+0

スチュアートはいくつかの素晴らしいコードを書いていますが、それは私が望むものよりずっと複雑で、私は生年月日の日付選択をしたくありません。 POSTアクションにコードを追加しました(更新された質問を参照)。それは正常に範囲の日付をトラップし、デバッガでそれを見るときにDOBとスキルのフィールドを更新しますが、ビューが再表示されても古い値が残っています(DOBを1/1/0001は、有効期限が必要な検証を開始します。スキルはテストのためのものです)。ビューで編集したフィールドが更新されない理由をご存知ですか? – Joe

+0

これは、モデルで設定した値ではなく、ビューを再表示するときにHTMLヘルパーがModelStateの値を使用していることが原因である可能性があります。変更を有効にするには、モデル状態から値を削除する必要があります。例えば、あなたはあなたのaction => 'ModelState.Remove(" Modified ")に' Modified'、 'DOB'と' Skill'のプロパティを設定しようとしているようです。 ModelState.Remove( "DOB"); ModelState.Remove( "スキル"); '。 –

+0

ModelStateを見ている間にこの解決策が見つかりました。[1]:http://stackoverflow.com/questions/5739362/modelstate-addmodelerror-how-can-i-add-an-error-that-isnt-for-a-property ModelState.AddModelError();コードの更新されたPOSTを参照してください。 – Joe

関連する問題