从我的MVC3应用程序中得到一些非常恼人的行为。所以我有一个有三个值的模型:
[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中填充的,所以我在ViewBag中弹出DropDownListItems,并在视图中呈现它们:
@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的都包含了预填充的值!
检查了模型,值仅在AirLineCode1中设置。检查了ViewBag,没有选定的SelectListItems。所以我想ViewBag一定是在维护一个引用。所以我把我的代码改为:
ViewBag.AirLines = PopulateAirlines(user);
ViewBag.AirLines2 = PopulateAirlines(user);
ViewBag.AirLines3 = PopulateAirlines(user);砰,修好了。问题是PopulateAirlines是一个昂贵的过程!
问题是,ViewBag似乎在维护3 SelectListItem Lists之间的引用。
我尝试了下面的代码,这完全失败了:
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 2’的'IEnumerable‘类型的IEnumerable项。
什么??!
发布于 2013-01-02 17:30:58
这可能是因为在本代码中:
IEnumerable<SelectListItem> airLines = PopulateAirlines(user);
ViewBag.AirLines = airLines;
ViewBag.AirLines2 = airLines;
ViewBag.AirLines3 = airLines;所有ViewBag属性都引用相同的列表。因此,当引用任何属性时,对列表的更改将反映出来。当您调用PopulateAirlines()方法时,您将创建3个不同的列表。
您需要创建三个单独的列表,但只需要使用PopulateAirlines方法创建第一个列表,然后使用克隆两次。那就不会那么贵了。
https://stackoverflow.com/questions/14125510
复制相似问题