戻るボタンを使用してフォームを再送信すると、ドロップダウン リストにバインドされたモデルの値が 2 回目の送信で保持されないという問題が発生します。
実際には、このコードはレポート ジェネレーターです。フォームはユーザーからパラメーターを収集し、データが表示される結果ビューに投稿します。明らかに、これは投稿するにはかなり複雑なコードですが、以下に同じバグを示す簡単なコードをいくつか示します。
私は次のようなモデルを持っています:
public class HomeModel
{
public string SomeText { get; set; }
public long SelectedItemId { get; set; }
public IEnumerable<SelectListItem> AvailableItems { get; set; }
}
次のようなモデルのインスタンスを送信するフォーム:
@using(Html.BeginForm("Result", "Home", FormMethod.Get))
{
@Html.EditorFor(model => model.SomeText)
<br />
@Html.DropDownListFor(model => model.SelectedItemId, Model.AvailableItems)
<input type="submit" value="submit" />
}
そして、そのような詳細を示すビュー
You Typed: @Html.DisplayFor(model => model.SomeText) <br />
You Selected: @Html.DisplayFor(model => model.SelectedItemId)
そして、すべてを管理するコントローラー:
public class HomeController : Controller
{
//
// GET: /Home/
public ActionResult Index()
{
HomeModel model = new HomeModel();
List<SelectListItem> items = new List<SelectListItem>();
for (int i = 0; i < 10; i++)
items.Add(new SelectListItem() { Value = i.ToString(), Text = i.ToString() });
model.AvailableItems = items;
return View(model);
}
public ActionResult Result(HomeModel model)
{
return View(model);
}
}
フォームに入力し、送信を押します。結果ビューにリダイレクトされ、すべて問題ありません。
次に、ブラウザをもう一度押すと、再び Index ビューが表示されます。
その後、フォームを再度送信すると、事態は悪化します。ブラウザーで以前に選択した値がリストに表示されているように見えますが、リストから選択した値がモデルに再入力されません。
文字列プロパティは正しく更新されています。これは、この動作を表示している実際のコードにも当てはまります。
これは IE でのみ発生し、バージョン 9 を使用しています。