簡體   English   中英

將Viewmodel對象發送到ASP .Net MVC中的剃刀視圖

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM