意外改变变量

时间:2015-12-23 11:22:04

标签: c# asp.net-mvc

当我在方法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

1 个答案:

答案 0 :(得分:1)

因为ViewBag.Groups中的列表仍包含与原始列表tournamentsGroups相同的对象。复制对列表的引用,其内容根本不会更改。仍然只有一个列表

您需要复制整个列表及其项目,以防止后续操作更改您指定的列表。

如果您只使用一个属性(Belt),则可能需要创建string的新列表,这比克隆每个对象要容易得多。如果您需要克隆每个对象,请查看Deep cloning objects