【问题标题】:How to display foreign key related data in razor view in MVC using Ado.Net如何使用 Ado.Net 在 MVC 的 razor 视图中显示外键相关数据
【发布时间】:2018-05-23 09:45:43
【问题描述】:

这是我的课

 public class Student
{
    public int StudentId { get; set; }

    public string Name { get; set; }

    public int DeptId { get; set; }

    public Dept Dept { get; set; }
}

为了显示列表,我使用 ado.net。这是我的控制器:

 public ActionResult Index()
    {
        StudentRepo repo = new StudentRepo();
        List<Student> students = repo.GetStudent().ToList();
        return View(students);
    }

GetStudent 方法

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"]);// here found student Id 
            dpt.Name = Convert.ToString(dr["Name"]);// here found student name 


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

剃刀视图是:

 @foreach (var item in Model) {
<tr>
    <td>
        @Html.DisplayFor(modelItem => item.Name)
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.Roll)
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.Dept.Name)
    </td>
</tr>

}

存储过程:

select StudentTbl.StudentId,StudentTbl.Name,StudentTbl.ROll, StudentTbl.DeptId,DeptTbl.Name
from  Demo.dbo.StudentTbl inner join 
Demo.dbo.DeptTbl ON  StudentTbl.DeptId = DeptTbl.DeptId 

目前它显示部门 ID。 现在问题出在列表中,我不知道如何显示部门名称。 我怎样才能做到这一点?任何形式的帮助将不胜感激。

编辑:现在当我在 dpt 对象中绑定 Dept 数据时,它会找到 StudentTbl Id & Name

【问题讨论】:

  • 在您的查询中,INNER JOIN 到部门表(当然是通过部门 ID),以允许您获取每个学生的部门数据。然后,当您填充 Student 类时,使用相应列中的值设置其 Dept 对象的属性。您还没有向我们展示如何从 DataTable 转换为“学生”对象列表,但大概您有一些代码。或者您是否直接将 DataTable 设为您的模型(在这种情况下,您可以直接从视图中引用列)?如果是这样,那么 Student 类的意义何在?不清楚。
  • 请您现在检查一下。我尝试按照您的指示进行操作,但无法成功。这段代码有什么问题
  • 究竟是哪一部分出了问题?你得到一个错误,或者其他什么是错误的?请说清楚。除了dpt.Name = Convert.ToString(dr["Name"]); 之外,您显示的代码还可以,显然需要更改才能获得部门名称。问题是,我看不到你的存储过程代码,所以我不知道你在那里做了什么,或者你在输出中调用了部门名称列,所以我不能轻易地给你建议。如果您需要进一步的帮助,请出示该代码
  • 部门表名称也定义为名称..所以我写dpt.Name = Convert.ToString(dr["Name"]);。我给我的商店程序。你能给我建议吗?
  • 首先尝试简单的dr["DeptTbl.Name"],这可能有效,但我不确定。如果没有,那么正常的做法是为您的列名使用别名,使它们独一无二:select StudentTbl.StudentId,StudentTbl.Name as StudentName ,StudentTbl.ROll, StudentTbl.DeptId,DeptTbl.Name as DeptName 然后当然更改您的 C# 代码以匹配新别名

标签: asp.net-mvc razor ado.net


【解决方案1】:

通常的解决方案是为您的列名使用别名,以使它们独一无二:

select 
  StudentTbl.StudentId,
  StudentTbl.Name as StudentName,
  StudentTbl.ROll, 
  StudentTbl.DeptId,DeptTbl.Name as DeptName 

然后当然要更改您的 C# 代码以匹配新别名:

dpt.Name = Convert.ToString(dr["DeptName"]);

Name = Convert.ToString(dr["StudentName"])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 2021-07-04
    相关资源
    最近更新 更多