SelectListItem 复选框并使用 Contains() 自动填充
SelectListItem checkboxes and autopopulate with using Contains()
我有课程列表。如果将用户分配给课程,那么我希望选中该复选框。为什么 Contains() 不被接受?
视图模型:
public class ViewUserViewModel
{
public List<Cours> Courses { get; set; }
public List<UserCours> UserCoursesList { get; set; }
public AspNetUser user { get; set; }
public IEnumerable<SelectListItem> CourseList { get; set; }
}
控制器:
[HttpGet]
public ActionResult ViewUser(string id)
{
ViewUserViewModel model = new ViewUserViewModel();
model.user = db.AspNetUsers.FirstOrDefault(U => U.Id == id);
//List all courses
List<Cours> allCourses = db.Courses.OrderBy(c => c.CourseName).ToList();
model.Courses = allCourses;
//List of courses the user is assigned to
//var selectedCourse1 = db.UserCourses.Where(uc => uc.UserId == id).ToList();
model.UserCoursesList = db.UserCourses.Where(uc => uc.UserId == id).ToList();
//checkbox list
model.CourseList = allCourses.ToList().Select(x => new SelectListItem()
{
//Selected = selectedCourse1.Contains(x.CourseID),
Selected = model.UserCoursesList.Contains(x.CourseID),
Text = x.CourseName,
Value = x.CourseID.ToString()
});
}
我认为 Selected 属性 将测试 List 是否具有分配的值,然后它将 return 返回 true。相反,它是一个语法错误并且具有无效参数。我如何比较 CourseList 和 UserCoursesList?
我认为你应该使用 LINQ Any 方法。你没有发布你的 UserCours
class 定义,但我想它应该有一个 ID,并且可能看起来像这样:
public class Cours
{
public int Id { get; set; }
// Other properties
}
在这种情况下,您对 Selected
属性 的检查将是:
Selected = model.UserCoursesList.Any(uc => uc.CourseID == x.CourseID)
一些小技巧:
- 在这种情况下,最好使用一些有意义的名称而不是
x
,例如 course
。它将提高代码的可读性。
allCourses
已经是一个列表,不需要调用ToList()
再次方法。
更新代码: 感谢 Aleksandr
[HttpGet]
public ActionResult ViewUser(string id)
{
ViewUserViewModel model = new ViewUserViewModel();
//Which user
model.user = db.AspNetUsers.FirstOrDefault(User => User.Id == id);
//List all courses
model.Courses = db.Courses.OrderBy(Courses => Courses.CourseName).ToList();
//List of courses the user is assigned to
model.UserCoursesList = db.UserCourses.Where(UserCourses => UserCourses.UserId == id).ToList();
//checkbox list
model.CourseList = model.Courses.Select(Course => new SelectListItem()
{
Selected = model.UserCoursesList.Any(UserCourse => UserCourse.CourseId == Course.CourseID),
Text = Course.CourseName,
Value = Course.CourseID.ToString()
});
return View(model);
}
我有课程列表。如果将用户分配给课程,那么我希望选中该复选框。为什么 Contains() 不被接受?
视图模型:
public class ViewUserViewModel
{
public List<Cours> Courses { get; set; }
public List<UserCours> UserCoursesList { get; set; }
public AspNetUser user { get; set; }
public IEnumerable<SelectListItem> CourseList { get; set; }
}
控制器:
[HttpGet]
public ActionResult ViewUser(string id)
{
ViewUserViewModel model = new ViewUserViewModel();
model.user = db.AspNetUsers.FirstOrDefault(U => U.Id == id);
//List all courses
List<Cours> allCourses = db.Courses.OrderBy(c => c.CourseName).ToList();
model.Courses = allCourses;
//List of courses the user is assigned to
//var selectedCourse1 = db.UserCourses.Where(uc => uc.UserId == id).ToList();
model.UserCoursesList = db.UserCourses.Where(uc => uc.UserId == id).ToList();
//checkbox list
model.CourseList = allCourses.ToList().Select(x => new SelectListItem()
{
//Selected = selectedCourse1.Contains(x.CourseID),
Selected = model.UserCoursesList.Contains(x.CourseID),
Text = x.CourseName,
Value = x.CourseID.ToString()
});
}
我认为 Selected 属性 将测试 List 是否具有分配的值,然后它将 return 返回 true。相反,它是一个语法错误并且具有无效参数。我如何比较 CourseList 和 UserCoursesList?
我认为你应该使用 LINQ Any 方法。你没有发布你的 UserCours
class 定义,但我想它应该有一个 ID,并且可能看起来像这样:
public class Cours
{
public int Id { get; set; }
// Other properties
}
在这种情况下,您对 Selected
属性 的检查将是:
Selected = model.UserCoursesList.Any(uc => uc.CourseID == x.CourseID)
一些小技巧:
- 在这种情况下,最好使用一些有意义的名称而不是
x
,例如course
。它将提高代码的可读性。 allCourses
已经是一个列表,不需要调用ToList()
再次方法。
更新代码: 感谢 Aleksandr
[HttpGet]
public ActionResult ViewUser(string id)
{
ViewUserViewModel model = new ViewUserViewModel();
//Which user
model.user = db.AspNetUsers.FirstOrDefault(User => User.Id == id);
//List all courses
model.Courses = db.Courses.OrderBy(Courses => Courses.CourseName).ToList();
//List of courses the user is assigned to
model.UserCoursesList = db.UserCourses.Where(UserCourses => UserCourses.UserId == id).ToList();
//checkbox list
model.CourseList = model.Courses.Select(Course => new SelectListItem()
{
Selected = model.UserCoursesList.Any(UserCourse => UserCourse.CourseId == Course.CourseID),
Text = Course.CourseName,
Value = Course.CourseID.ToString()
});
return View(model);
}