【问题标题】:Sending Viewmodel object to a razor view in ASP .Net MVC将 Viewmodel 对象发送到 ASP .Net MVC 中的剃刀视图
【发布时间】:2016-02-23 20:40:23
【问题描述】:

在我的 MVC 项目中,我有一个 Student 模型类和一个 Department 模型类。为了建立一对多关系,我在学生模型类中有一个外键 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; }
}

但是,我希望用户看到的是 DepartmentName,而不是 Student Class 中的 DepartmentID。所以 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; }

}

但是如何在我的控制器操作方法中获取部门名称,该方法显示数据库中所有学生的列表。

    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 获得的列表中的每个学生对象?我知道这是微不足道的。但请帮助我。提前致谢。

【问题讨论】:

  • 在您的视图中,您应该可以看到 student_dept.DepartmentName。查看代码在哪里?
  • 我认为我无法仅填充 viewmodel 集合。所以我忍住了。我无法填充 student_dept_lst 并将视图模型对象添加到其中。
  • @StrugglingCoder 你检查过我下面的答案了吗:)?

标签: c# asp.net asp.net-mvc asp.net-mvc-4 razor


【解决方案1】:

正确的做法是在Student 类中添加一个Departement 导航属性,如下所示:

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); 

【讨论】:

  • .Include(s => s.Department) 说“无法将 lambda 表达式转换为类型‘字符串’,因为它不是委托类型”。
  • 您必须通过添加此using System.Data.Entity;" 来导入System.Data.Entity 命名空间
【解决方案2】:

看起来不错,但您没有将 student_dept 添加到 studentviewmodel 列表中。

此外,您应该选择一个选项 - 如果您的视图模型上有 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);
}

【讨论】:

  • ... student_dept.DepartmentName = from d in department where d.DepartmentID == s.DepartmentID select d.DepartmentName 抛出错误“无法隐式转换类型 'System.Collections.Generic.IEnumerable '到'字符串'"。
猜你喜欢
  • 2012-06-14
  • 1970-01-01
  • 1970-01-01
  • 2021-04-23
  • 1970-01-01
  • 1970-01-01
  • 2013-10-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多