Asp.net mvc 3 根据ASP.NET MVC 3中的选定ID在SelectList中为集合中的每个对象设置选定属性
后续问题: 我遇到的问题是编辑视图中的下拉框没有根据BugAssignment模型中的AssignedUserID属性保留/选择适当的项 型号:Asp.net mvc 3 根据ASP.NET MVC 3中的选定ID在SelectList中为集合中的每个对象设置选定属性,asp.net-mvc-3,entity-framework,drop-down-menu,selectlistitem,Asp.net Mvc 3,Entity Framework,Drop Down Menu,Selectlistitem,后续问题: 我遇到的问题是编辑视图中的下拉框没有根据BugAssignment模型中的AssignedUserID属性保留/选择适当的项 型号: public class BugAssignment { public int BugAssignmentID { get; set; } public int BugNumber { get; set; } public int? AssignedUserID { get; set; } public virtual
public class BugAssignment
{
public int BugAssignmentID { get; set; }
public int BugNumber { get; set; }
public int? AssignedUserID { get; set; }
public virtual User AssignedUser { get; set; }
public virtual Status Status { get; set; }
public IEnumerable<SelectListItem> Users { get; set; }
}
public class BugAssignmentList
{
public BugAssignmentList()
{
BugAssignments = new List<BugAssignment>();
}
public int BugAssignmentListID { get; set; }
public string Name { get; set; }
public List<BugAssignment> BugAssignments { get; set; }
}
编辑/详细信息视图模型
public class BugAssignmentListDetailsViewModel
{
public int BugAssignmentListID { get; set; }
public string Name { get; set;}
public List<BugAssignment> BugAssignments { get; set; }
}
我的控制器中有以下两种方法:
public ActionResult Edit(int id)
{
var balData = db.BugAssignmentLists.Include(bn => bn.BugAssignments).ToList();
//this is a reference to the bug assignment list object whose ID was passed in
BugAssignmentList bugAssignmentList = balData.Where(b => b.BugAssignmentListID == id).FirstOrDefault();
//loop through the bug assignment list and for each bug assignment
foreach (BugAssignment b in bugAssignmentList.BugAssignments)
{
//create the select list for each BugAssignment object
b.Users = users.Select(u => new SelectListItem
{
Value = u.UserID.ToString(),
Text = u.FullName,
Selected = u.UserID == b.AssignedUserID //<<THIS IS WHERE IT IS MESSING UP
});
}
BugAssignmentListDetailsViewModel detailsVM = new BugAssignmentListDetailsViewModel
{
BugAssignmentListID = id
};
if (bugAssignmentList != null)
{
detailsVM.BugAssignments = bugAssignmentList.BugAssignments;
detailsVM.Name = bugAssignmentList.Name;
}
return View(detailsVM);
}
// POST
[HttpPost]
public ActionResult Edit(BugAssignmentListDetailsViewModel viewModel)
{
var balData = db.BugAssignmentLists.Include(bn => bn.BugAssignments).ToList();
var users = db.Users.ToList();
BugAssignmentList bugAssignmentList = balData.Where(b => b.BugAssignmentListID == viewModel.BugAssignmentListID).FirstOrDefault();
bugAssignmentList.Name = viewModel.Name;
bugAssignmentList.BugAssignments = viewModel.BugAssignments;
if (ModelState.IsValid)
{
UpdateModel(bugAssignmentList, "BugAssignmentList");
db.Entry(bugAssignmentList).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(bugAssignmentList);
}
视图:
这个职位运作良好。在数据库中查看,BugAssignmentList中BugAssignments集合中的每个BugAssignment都在使用我的编辑视图中下拉框中的适当AssignedUserID进行更新,因此它不是POST方法
问题在于Editint id。发生的事情非常奇怪。我已经在foreach循环前面放置了一个断点,并查看了bugList.BugAssignments的内部。所有AssignedUserID都是正确的,但是循环完成后,我再次检查列表,BugAssignment中的所有SelectListItems。用户选择了相同的用户
以下代码有什么问题会导致这种情况
foreach (BugAssignment b in bugAssignmentList.BugAssignments)
{
//create the select list for each BugAssignment object
b.Users = users.Select(u => new SelectListItem
{
Value = u.UserID.ToString(),
Text = u.FullName,
Selected = u.UserID == b.AssignedUserID //<<THIS IS WHERE IT IS MESSING UP
});
}
另外,作为旁注:我希望界面看起来像这样,这就是为什么我需要将SelectList放在BugAssignment模型上,除非有更简单的方法。我不想编写BugAssignment控制器/视图,我希望有人能够快速将用户分配到bug编号,如下所示:
下面是另一个屏幕截图,可以更好地显示正在发生的事情:
我猜这是闭包的问题。由于您在lambda中生成SelectListItem,因此它只获取第一个b.AssignedUserID的副本,并在任何地方使用它。关于这方面的一些阅读材料: 我认为这一修改可能会解决问题:
foreach (BugAssignment b in bugAssignmentList.BugAssignments)
{
var bugAssignedUser = b.AssignedUserID;
//create the select list for each BugAssignment object
b.Users = users.Select(u => new SelectListItem
{
Value = u.UserID.ToString(),
Text = u.FullName,
Selected = u.UserID == bugAssignedUser //<<THIS IS WHERE IT IS MESSING UP
});
}
我猜这是闭包的问题。由于您在lambda中生成SelectListItem,因此它只获取第一个b.AssignedUserID的副本,并在任何地方使用它。关于这方面的一些阅读材料: 我认为这一修改可能会解决问题:
foreach (BugAssignment b in bugAssignmentList.BugAssignments)
{
var bugAssignedUser = b.AssignedUserID;
//create the select list for each BugAssignment object
b.Users = users.Select(u => new SelectListItem
{
Value = u.UserID.ToString(),
Text = u.FullName,
Selected = u.UserID == bugAssignedUser //<<THIS IS WHERE IT IS MESSING UP
});
}
我认为这是一个结束问题。尝试创建b.assignedUserID的本地副本:
我认为这是一个结束问题。尝试创建b.assignedUserID的本地副本:
谢谢你的链接,我正要向上面的海报询问更多信息,了解为什么这样做不起作用。谢谢你的链接,我正要向上面的海报询问更多信息,了解为什么这样做不起作用。我读了一些关于关闭问题的文章……我对C和ASP.NET还是新手,这是你必须意识到的陷阱之一,我想是吧。再次感谢。我读了一些关于闭包问题的书……我对C和ASP.NET还是新手,我想这是你必须注意的陷阱之一。再次感谢。
foreach (BugAssignment b in bugAssignmentList.BugAssignments)
{
var assignedUserID = b.AssignedUserID;
//create the select list for each BugAssignment object
b.Users = users.Select(u => new SelectListItem
{
Value = u.UserID.ToString(),
Text = u.FullName,
Selected = (u.UserID == assignedUserID),
});
}