如何在ASP.NET MVC视图中显示数据库记录

18

在使用C#的ASP.NET MVC中,如何将一些数据库记录传递给视图并以表格形式显示?

我需要知道如何将从数据库返回到SqlDataReader对象中的某些行记录传输/传递,并将该对象传递给视图,以便我可以使用foreach在视图中显示该对象包含的所有记录。

以下是我正在尝试执行的代码。但它没有起作用。

控制器:

public ActionResult Students()
{
    String connectionString = "<THE CONNECTION STRING HERE>";
    String sql = "SELECT * FROM students";
    SqlCommand cmd = new SqlCommand(sql, connectionString);

    using(SqlConnection connectionString = new SqlConnection(connectionString))
    {
        connectionString.Open();
        SqlDataReader rdr = cmd.ExecuteReader();
    }

    ViewData.Add("students", rdr);

    return View();
}

观点:

<h1>Student</h1>

<table>
    <!-- How do I display the records here? -->
</table>

2
不行 - 设计有问题 - 在连接释放(using语句)后,您无法从SqlDataReader中获取数据。您是否阅读过一些MVC / Razor教程? - user2160375
2
是的,我知道它的结构不好。这就是为什么我需要从你们有经验的人那里了解最佳方法。:) 我刚刚开始学习ASP.NET MVC和C#。 - doncadavona
谢谢Giannis!来自(http://stackoverflow.com/users/2401981/giannis-paraskevopoulos)。你的答案有效,我相信这是解决我的问题的最佳方法。 - doncadavona
1
我还发现了DotFunda.com上的这个链接,它解决了我的问题,并且与Gianinis所说的解决方案相同:http://www.dotfunda.com/articles/show/2550/send-list-from-controller-to-view-in-mvc-application - doncadavona
2个回答

59

1.首先创建一个Model,用于保存记录的值。例如:

public class Student
{
    public string FirstName {get;set;}
    public string LastName {get;set;}
    public string Class {get;set;}
    ....
}

2. 然后将从您的读取器中加载的行加载到列表或其他容器中:

public ActionResult Students()
{
    String connectionString = "<THE CONNECTION STRING HERE>";
    String sql = "SELECT * FROM students";
    SqlCommand cmd = new SqlCommand(sql, conn);

    var model = new List<Student>();
    using(SqlConnection conn = new SqlConnection(connectionString))
    {
        conn.Open();
        SqlDataReader rdr = cmd.ExecuteReader();
        while(rdr.Read())
        {
            var student = new Student();
            student.FirstName = rdr["FirstName"];
            student.LastName = rdr["LastName"];
            student.Class = rdr["Class"];
            ....

            model.Add(student);
        }

    }

    return View(model);
}

3. 最后,在您的View中声明您的模型的类型:

@model List<Student>

<h1>Student</h1>

<table>
    <tr>
        <th>First Name</th>
        <th>Last Name</th>
        <th>Class</th>
    </tr>
    @foreach(var student in Model)
    {
    <tr>
        <td>@student.FirstName</td>  
        <td>@student.LastName</td>  
        <td>@student.Class</td>  
    </tr>
    }
</table>

1
非常感谢,这真的很有帮助。我甚至学会了如何使用模型! - doncadavona
1
我很高兴这对你有所帮助。你可以将其作为答案接受,以供未来读者参考,如果你愿意也可以点赞。 - Giannis Paraskevopoulos
哦,是的,当然。我现在还不能点赞。但是当我在SOF上有足够的声望时,我会这样做的。谢谢! - doncadavona

5
如果您不必使用SQL读取器,那么将控制器设置为以下内容是否更容易。
Controller.cs
private ConnectContext db = new ConnectContext();

public ActionResult Index()
   {
     return View(db.Tv.ToList());
   }

ConnectContext.cs

public class ConnectContext : DbContext
{
    public DbSet<Student> Student{ get; set; }
}

这样,您的连接字符串将保存在您的web.config文件中,视图和模型不会改变。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接