私のHTMLエディタは私が設定した値を無視しており、常にリクエストデータから値を取得しています。どうして?

私は、 "Date"という名前のHTTP GETパラメータがあり、その名前が "Date"であるTextBoxを作成して、それに必要な値を設定することができないという状況があります。

私の見解では、私が書く場合:

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

TextBoxは 99/99/9999 という値ではなく、リクエストからの値でレンダリングされます。 02/07/2012 としましょう。ビューモデルから値を渡す( 02/07/2012 とは異なる値に積極的に設定する) EditorFor を使用する場合も同様です

何があってもリクエストデータを無効にすることはできません。

私は何をすべきか?

編集

Darin Dimitrov氏が賢明に説明したように、リクエストからの値を変更してビューに表示する場合は、 ModelState から削除する必要があります。

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

2

1 答え

どうすればよいですか?

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の値が使用されます。これは設計によるものです。

5
追加された
申し訳ありませんが、私はそれが実際にGETの値であることを述べた質問を編集しました。これによりあなたの反応が変わることがあります。私はあなたのことを理解しており、今それをチェックしています。
追加された 著者 André Pena,
さて、あなたの努力に感謝します。私はあなたのソリューションをチェックしています。私は数分であなたに戻ってきます
追加された 著者 André Pena,
ありがとう、それは動作します!私は同じ問題に直面している将来の人々のためにいくつかの説明を追加して質問を編集した
追加された 著者 André Pena,
@AndréPena、いいえ、GETリクエストにも同じことが適用されます。 Date というクエリ文字列パラメータがあり、GETコントローラアクションが日付と呼ばれるプロパティを持つビューモデルをパラメータとして取る場合、この値はModelStateに格納されます。したがって、あなたのアクションでそれを変更する必要がある場合は、私の答えに示されているようにModelStateからそれを削除する必要があります。ヘルパーが渡す値を考慮していないと言っている場合は、最初に削除する必要があるモデル状態の値が異なることを意味します。
追加された 著者 Darin Dimitrov,