[英]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.