如何在MVC的Razor视图中使用Ado.Net显示外键关联数据
问题诊断与解决方案
嘿,这问题我太熟了!核心原因是你的存储过程返回了两个同名的Name列——一个来自学生表,一个来自部门表,当你用dr["Name"]读取时,默认只会拿到第一个(学生的姓名),所以部门对象的Name被错误赋值成了学生名字,自然显示不对。
咱们一步步来修正:
第一步:给存储过程的重名列加别名
把部门表的Name列起个独特的别名,比如DeptName,这样结果集里的列就不会重名冲突了:
select StudentTbl.StudentId, StudentTbl.Name, StudentTbl.Roll, StudentTbl.DeptId, DeptTbl.Name as DeptName -- 给部门名称列加别名 from Demo.dbo.StudentTbl inner join Demo.dbo.DeptTbl ON StudentTbl.DeptId = DeptTbl.DeptId
第二步:修改GetStudent方法,读取正确的部门名称列
现在遍历DataRow时,要读取咱们刚加的DeptName列来赋值给部门对象的Name,顺便修正你之前写错的注释:
public List<Student> GetStudent() { connection(); List<Student> stdList = new List<Student>(); SqlCommand com = new SqlCommand("Sp_GetStudent", con); com.CommandType = CommandType.StoredProcedure; SqlDataAdapter da = new SqlDataAdapter(com); DataTable dt = new DataTable(); con.Open(); da.Fill(dt); con.Close(); foreach (DataRow dr in dt.Rows) { Dept dpt = new Dept(); dpt.DeptId = Convert.ToInt32(dr["DeptId"]); // 这是部门ID,不是学生ID哦 dpt.Name = Convert.ToString(dr["DeptName"]); // 读取别名后的部门名称列 stdList.Add( new Student { StudentId = Convert.ToInt32(dr["StudentId"]), Name = Convert.ToString(dr["Name"]), Roll = Convert.ToString(dr["Roll"]), DeptId = Convert.ToInt32(dr["DeptId"]), Dept = dpt } ); } return stdList; }
小补漏:完善Student类的Roll属性
看你的Student类定义里没有Roll属性,但代码里却在赋值和展示,记得补上避免报错:
public class Student { public int StudentId { get; set; } public string Name { get; set; } public int DeptId { get; set; } public Dept Dept { get; set; } public string Roll { get; set; } // 补上这个缺失的属性 }
做完这些修改后,你的Razor视图里@Html.DisplayFor(modelItem => item.Dept.Name)就能正确显示部门名称啦!
内容的提问来源于stack exchange,提问作者Rasul005
相关产品推荐
相关产品推荐

