2012-02-06 8 views
2

"Date"という名前のHTTP GETパラメータがあり、その名前が "Date"であるテキストボックスを作成して、それに必要な値を設定することができないという状況があります。私の見解では私のHTMLエディタは私が設定した値を無視しており、常にリクエストデータから値を取得しています。どうして?

は、私が書く場合:

@Html.TextBox("Date", "99/99/9999") 

のTextBoxはない値99/99/9999でなく、リクエストから来ている値でレンダリングされます、のは言わせて:02/07/2012。私は

私がどんな要求データを上書きしないカント(私は積極的に02/07/2012異なる値に設定されていること)ビューモデルから値を渡すEditorForを使用した場合も同じことが起こります。

どうすればよいですか?ダーリンディミトロフとして

EDIT

賢明なあなたがビューに表示するために、要求から値を変更したい時はいつでも、あなたはModelStateからそれを削除する必要があり、説明しました。

これは、GETリクエストでDateTimeを処理する場合に特に便利です。 ASP.NET MVCモデルバインドでは、日付はGET要求でMM/dd/yyyyの形式になります。しかし、それをユーザーに表示したい場合は、おそらくDisplayFormatAttributeを使用してdd/MM/yyyyに再フォーマットすることができます。ただし、ModelStateから最初に日付を削除しない限り、これは不可能です。

答えて

5

どうすればよいですか?

あなたのPOSTのコントローラのアクション中にModelStateからそれを削除します。

[HttpPost] 
public ActionResult Foo(MyViewModel model) 
{ 
    ModelState.Remove("Date"); 
    return View(model); 
} 

明らかにあなたは意志の弱い型付けされたヘルパーでは動作しないようにしません:

@Html.TextBox("Date", "99/99/9999") 

をあなたが仕事をしたいです強く型付けされたモデルとエディタテンプレートを使用します。

@Html.EditorFor(x => x.Date) 

そして、あなたのPOSTのコントローラのアクションにあなたが必要な日付を設定します:私は明示的におそらく間違ってここに日付プロパティとして文字列を使用していた

[HttpPost] 
public ActionResult Foo(MyViewModel model) 
{ 
    ModelState.Remove("Date"); 
    model.Date = "99/99/9999"; 
    return View(model); 
} 

は、私はちょうど99/99/9999の妥当性と困惑しました文字列を日付として返します。しかし明らかに日付についても同じことが当てはまります。

なぜなら、HTMLヘルパーは、ModelStateを値にバインドするときとモデルの後にバインドするときにModelStateを最初に調べるからです。したがって、モデルの値を変更しても、ModelStateで異なる値(POSTアクションで頻繁に発生する)が使用されると、ModelStateの値が使用されます。これは設計によるものです。

+0

申し訳ありませんが、私は実際にはGET値であることを述べた質問を編集しました。これによりあなたの反応が変わることがあります。私はあなたのことを理解しており、今それをチェックしています。 –

+1

@AndréPena、いいえ、GETリクエストにも同じことが適用されます。'Date'というクエリ文字列パラメータがあり、GETコントローラアクションがDateというプロパティを持つビューモデルをパラメータとして取る場合、この値はModelStateに格納されます。したがって、あなたのアクションでそれを変更する必要がある場合は、私の答えに示されているようにModelStateからそれを削除する必要があります。ヘルパーが渡す値を考慮していないと言っている場合は、最初に削除する必要があるモデル状態の値が異なることを意味します。 –

+0

よろしくお願いします。私はあなたの解決策をチェックしており、私は数分であなたに戻ってきます。 –

関連する問題