繁体   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