当我在方法EditSelectList中更改组列表时,它也会影响ViewBag.Groups。为什么会这样?我之前分配了ViewBag。它不应该影响ViewBag.Groups和var tournamentsGroups
我在控制器中有这个代码:
[AllowAnonymous]
public ActionResult Details2(int id)
{
var tournamentsContext = new TournamentsContext();
var tournament = tournamentsContext.Tournament.Single(t => t.Id == id);
var groupsContext = new GroupsContext();
var tournamentsGroups = groupsContext.Groups.Where(g => g.IdTournament == tournament.Id && g.SexMale == true).ToList();
ViewBag.Groups = tournamentsGroups;
ViewBag.groupId = new SelectList(EditSelectList(tournamentsGroups), "Id", "Belt");
ViewBag.tournamentId = id;
ViewBag.InTournament = CurrentUserInTournament(tournament.Id, currentUser);
return View(tournament);
}
private List<Groups> EditSelectList(List<Groups> groups)
{
foreach (var item in groups)
{
item.Belt = item.Belt + " - " + item.WeightKg; // for dropdownlist
}
return groups;
}
和查看
@model TournamentApp.Models.Tournament
@foreach (var item in ViewBag.Groups)
{
if ("white".Equals(@item.Belt) || true)
{
<h4>@item.Belt</h4>
}
}
// ... some another code for dropdownlist
结果是:
white - 65
white - 75
white - 85
blue - 75
但它应该只是:
white
white
white
blue
答案 0 :(得分:1)
因为ViewBag.Groups
中的列表仍包含与原始列表tournamentsGroups
相同的对象。复制对列表的引用,其内容根本不会更改。仍然只有一个列表。
您需要复制整个列表及其项目,以防止后续操作更改您指定的列表。
如果您只使用一个属性(Belt
),则可能需要创建string
的新列表,这比克隆每个对象要容易得多。如果您需要克隆每个对象,请查看Deep cloning objects。