【问题标题】:View Model data in view in ASP .Net MVC在 ASP .Net MVC 中查看模型数据
【发布时间】:2016-02-09 18:54:06
【问题描述】:

在我的项目中有两个领域模型类:Student.cs 和 Department.cs。学生类和部门类之间存在多对一的关系。

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

现在为了在 View 中向最终用户显示全名而不是名称组件,我想出了一个 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);
        }
        set
        {
            if (StudentFullName.Length > 1)
            {
                string[] tokens = StudentFullName.Split(' ');
                Student.FirstName = tokens[0];
                Student.LastName = tokens[tokens.Length - 1];
            }
        }
    }

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

下面的上下文数据库初始化器类是我的种子方法:

  protected override void Seed(StudentContext context)
        {
            var departments = new List<Department>
            {
                new Department {DepartmentID=1,DepartmentName="CSE",DepartmentCode="CS101"},
                new Department {DepartmentID=2,DepartmentName="ECE",DepartmentCode="EC197"},
                new Department {DepartmentID=3,DepartmentName="MECH",DepartmentCode="MC202"}
            };

            departments.ForEach(d => context.Departments.Add(d));
            context.SaveChanges();

            var students = new List<StudentViewModel> {
                new StudentViewModel {StudentId=1,StudentFullName = "Zack Dyas",UserName ="zack_dyas",DepartmentID=1,Password ="zack123"},
                new StudentViewModel {StudentId=2,StudentFullName = "Abraham D'Pedro",UserName ="ab_dpedro",DepartmentID=2,Password ="ab123"}
            };

            students.ForEach(s => context.Students.Add(s));
            context.SaveChanges();
}

如何在视图中显示部门名称而不是 2 个学生记录模型中的部门 ID?

【问题讨论】:

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


    【解决方案1】:

    ViewModel 表示它是一个DTO 数据传输对象,它不是数据库实体,而是一个具有您所定位的特定视图所需属性的类。
    在大多数情况下,每个视图应该有 1 个 ViewModel,并且不应在多个视图中重复使用相同的模型。

    因此,当您需要名称时使用 DepartmentName 创建 StudentXModel,并在需要 Id 时使用 DepartmentId 创建 StudentYModel。

    See more here

    【讨论】:

    • 但是当我从这个包含部门名称的视图模型中创建表时,它不会违反实体关系吗?理想情况下,外键应该是 departmentid 。因此,即使我在存储时将部门名称作为视图模型的一部分,也应该将部门名称返回到表中?对 ?我该怎么做。
    • 但是当我从这个包含部门名称的视图模型中创建表时,它不会违反实体关系你不应该从视图模型中创建表,这不是他们的方式应该使用。您正在使用 ViewModel 术语,却不了解它的真正含义。请阅读我链接的链接。
    【解决方案2】:

    使用视图模型

    public class StudentViewModel
    {
        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; }
    
        public int DepartmentID { get; set; }
        public String DepartmentName { get; set; }
    }
    

    在控制器中填充此 ViewModel,而不是返回 Student 返回 StudentViewModel。请记住在您的逻辑中填写DepartmentName 属性(此时您应该能够使用DepartmentID 获取DepartmentName 值)

    【讨论】:

      猜你喜欢
      • 2021-01-16
      • 2015-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-10
      • 2012-09-14
      • 2021-04-23
      • 1970-01-01
      相关资源
      最近更新 更多