[英]Sending Viewmodel object to a razor view in ASP .Net MVC
在我的MVC项目中,我有一个学生模型课和一个部门模型课。 为了建立一对多的关系,我在学生模型班上有一个外键 DepartmentID。
public class Student
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int StudentId { get; set; }
public String LastName { get; set; }
public String FirstName { get; set; }
public String UserName { get; set; }
public String Password { get; set; }
[ForeignKey("Department")]
public int DepartmentID { get; set; }
}
和
public class Department
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int DepartmentID { get; set; }
[Required(ErrorMessage="Department Name cannot be empty")]
public String DepartmentName { get; set; }
[Required(ErrorMessage = "Department Code cannot be empty")]
public String DepartmentCode { get; set; }
public virtual ICollection<Student> Students { get; set; }
}
但是我希望用户看到的不是DepartmentClass中的DepartmentID,而是用户看到的DepartmentName。 所以StudentViewModel类如下:
//View Model
public class StudentViewModel
{
public Student Student { get; set; }
public int StudentId { get; set; }
[Display(Name="StudentName")]
[Required(ErrorMessage="Student Name cannot be left blank")]
public String StudentFullName
{
get
{
return String.Format("{0} {1}", Student.FirstName, Student.LastName);
}
}
public String UserName { get; set; }
[DataType(DataType.Password)]
public String Password { get; set; }
[DataType(DataType.Password)]
[Compare("Password",ErrorMessage="Passwords do not match")]
[Display(Name="Confirm Password")]
public String C_Password { get; set; }
[Display(Name = "Department Name")]
public String DepartmentName { get; set; }
}
但是如何在我的控制器操作方法中获取部门名称,该方法显示DB中所有学生的列表。
public ActionResult MyAction()
{
StudentContext context = new StudentContext();
var students = context.Students.ToList();
var departments = context.Departments.ToList();
var student_dept_lst = new List<StudentViewModel>();
var departmentName = String.Empty;
foreach(var s in students)
{
var student_dept = new StudentViewModel();
student_dept.DepartmentName = from d in departments where d.DepartmentID == s.DepartmentID select d.DepartmentName;
}
return View(student_dept_lst );
}
如何将DepartmentName链接到从Context获得的列表中的每个学生对象? 我知道这很简单。 但是请帮帮我。 提前致谢。
正确的方法是将Departement
导航属性添加到Student
类中,如下所示:
public class Student
{
// Your properties you have already created still reamin here
public Department Department { get; set; }
}
然后对您的操作进行一些重构,如下所示:
StudentContext context = new StudentContext();
var viewModels = context.Students
.Include(s => s.Department) // tell EF to eager load the related department for each student
.Select(s => new StudentViewModel // this make a projection to your view model
{
Student = s,
DepartmentName = s.Department.DepartmentName
// Set all properties you need
}).ToList();
return View(viewModels);
看起来不错,但是没有将student_dept添加到studentviewmodel列表中。
另外,您应该选择一个选项-如果您的视图模型上有Student,则不需要Student中的每个属性(用户名,密码等)。 您可以仅通过Student对象进行引用。 或将那些属性保留在视图模型上并摆脱Student。 然后,在视图模型上相应地设置属性。
foreach(var s in students)
{
var student_dept = new StudentViewModel();
student_dept.DepartmentName = from d in departments where d.DepartmentID == s.DepartmentID select d.DepartmentName;
student_dept.Student = s;
//set other properties accordingly
student_dept_lst.Add(student_dept);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.