MVC3 アプリから非常に厄介な動作が発生します。だから私は3つの値を持つモデルを持っています:
[DisplayName("Airlines ")]
[StringLength(2, ErrorMessage = "Airline codes can only be 2 characters in length")]
public string AirlineCode1 { get; set; }
[DisplayName("Airlines")]
[StringLength(2, ErrorMessage = "Airline codes can only be 2 characters in length")]
public string AirlineCode2 { get; set; }
[DisplayName("Airlines")]
[StringLength(2, ErrorMessage = "Airline codes can only be 2 characters in length")]
public string AirlineCode3 { get; set; }
これらは から読み込まれるDropDowList
ので、 に をポップして、次DropDownListItem
のViewBag
ようなビューにレンダリングします。
@Html.LabelFor(l => l.AirlineCode1) <span>(select/enter code in box on right)</span>
<div id="airportCode1">
@Html.DropDownListFor(d => d.AirlineCode, ViewBag.AirLines as List<SelectListItem>) <input type="text" maxlength="2" value="@Model.AirlineCode1" />
</div>
<div id="airportCode2" style="@Model.AirlineCode2Style">
@Html.DropDownListFor(d => d.AirlineCode, ViewBag.AirLines2 as List<SelectListItem>) <input type="text" maxlength="2" value="@Model.AirlineCode2" />
</div>
<div id="airportCode3">
@Html.DropDownListFor(d => d.AirlineCode3, ViewBag.AirLines3 as List<SelectListItem>) <input type="text" maxlength="2" value="@Model.AirlineCode3" />
</div>
したがって、私のコントローラーは次のようになります。
IEnumerable<SelectListItem> airLines = PopulateAirlines(user);
ViewBag.AirLines = airLines;
ViewBag.AirLines2 = airLines;
ViewBag.AirLines3 = airLines;
AirLineCode
状況によっては、モデルに事前入力したい場合があります。そのため、コントローラーにモデル値を設定しました。これにより、いくつかの奇妙な動作が発生しました。突然、すべてのDropDownList
sに事前入力された値が含まれるようになりました。
型式を確認したところ、 に値のみが設定されていAirLineCode1
ます。をチェックしましたがViewBag
、選択されていませんSelectListItems
。したがってViewBag
、参照を維持する必要があると考えました。だから私は自分のコードを次のように変更しました:
ViewBag.AirLines = PopulateAirlines(user);
ViewBag.AirLines2 = PopulateAirlines(user);
ViewBag.AirLines3 = PopulateAirlines(user);
ブーム、修正。問題はPopulateAirlines
、高価なプロセスです!
問題は、ViewBag が 3SelectListItem
List
の間の参照を維持しているように見えることです。これをやめて、 への呼び出しを 1 回だけ行うにはどうすればよいPopulateAirlines(user);
ですか?
私は以下のコードを試しましたが、これは完全に爆発しました:
IEnumerable<SelectListItem> airLines = PopulateAirlines(user);
ViewBag.AirLines = airLines;
ViewBag.AirLines2 = airLines.Select(s => new SelectListItem() { Text = s.Text, Value = s.Value, Selected = s.Selected });
ViewBag.AirLines3 = airLines.Select(s => new SelectListItem() { Text = s.Text, Value = s.Value, Selected = s.Selected });
エラーで:
キー「AirlineCode2」を持つタイプ「IEnumerable」の ViewData アイテムはありません。
何??!