0

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ので、 に をポップして、次DropDownListItemViewBagようなビューにレンダリングします。

@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状況によっては、モデルに事前入力したい場合があります。そのため、コントローラーにモデル値を設定しました。これにより、いくつかの奇妙な動作が発生しました。突然、すべてのDropDownListsに事前入力された値が含まれるようになりました。

型式を確認したところ、 に値のみが設定されてい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 アイテムはありません。

何??!

4

1 に答える 1

1

これは、このコードが原因である可能性があります。

IEnumerable<SelectListItem> airLines = PopulateAirlines(user);
ViewBag.AirLines = airLines;
ViewBag.AirLines2 = airLines;
ViewBag.AirLines3 = airLines;

すべてのViewBagプロパティが同じリストを参照しています。したがって、リストへの変更は、プロパティのいずれかを参照するときに反映されます。()メソッドを呼び出すと、PopulateAirlines3つの異なるリストが作成されます。

3つの別々のリストを作成する必要がありますが、最初のリストはPopulateAirlinesメソッドを使用して作成し、次に2回クローンを作成するだけです。それはそれほど高価ではありません。

于 2013-01-02T17:30:58.300 に答える