首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ViewBag多重SelectListItems

ViewBag多重SelectListItems
EN

Stack Overflow用户
提问于 2013-01-02 16:25:40
回答 1查看 1.6K关注 0票数 0

从我的MVC3应用程序中得到一些非常恼人的行为。所以我有一个有三个值的模型:

代码语言:javascript
复制
[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,并在视图中呈现它们:

代码语言:javascript
复制
@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>

所以我的控制器看起来是:

代码语言:javascript
复制
IEnumerable<SelectListItem> airLines = PopulateAirlines(user);
ViewBag.AirLines = airLines;
ViewBag.AirLines2 = airLines;
ViewBag.AirLines3 = airLines;

现在,在某些情况下,我想在模型AirLineCode中预置、、。因此,我在控制器中设置了模型值。这导致了一些奇怪的行为。突然,我的所有DropDownList都包含了预填充的值!

检查了模型,值仅在AirLineCode1中设置。检查了ViewBag,没有选定的SelectListItems。所以我想ViewBag一定是在维护一个引用。所以我把我的代码改为:

代码语言:javascript
复制
ViewBag.AirLines = PopulateAirlines(user);
ViewBag.AirLines2 = PopulateAirlines(user);
ViewBag.AirLines3 = PopulateAirlines(user);

砰,修好了。问题是PopulateAirlines是一个昂贵的过程!

问题是,ViewBag似乎在维护3 SelectListItem Lists之间的引用。

我尝试了下面的代码,这完全失败了:

代码语言:javascript
复制
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项。

什么??!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-02 17:30:58

这可能是因为在本代码中:

代码语言:javascript
复制
IEnumerable<SelectListItem> airLines = PopulateAirlines(user);
ViewBag.AirLines = airLines;
ViewBag.AirLines2 = airLines;
ViewBag.AirLines3 = airLines;

所有ViewBag属性都引用相同的列表。因此,当引用任何属性时,对列表的更改将反映出来。当您调用PopulateAirlines()方法时,您将创建3个不同的列表。

您需要创建三个单独的列表,但只需要使用PopulateAirlines方法创建第一个列表,然后使用克隆两次。那就不会那么贵了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14125510

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档