【问题标题】:ASP.NET MVC Database accessASP.NET MVC 数据库访问
【发布时间】:2012-05-12 01:13:42
【问题描述】:

我一直在尝试在我的 ASP.NET MVC 项目中使用预先存在的数据库。我为我的(Microsoft SQL)数据库(“.\SQLEXPRESS.Databases”)创建了一个“数据连接”,其中包含“Test”表。该表有两列,“ID (int)”和“name (nvarchar(MAX))”。

在“模型”文件夹中,我放置了这个新类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

using System.Data.Entity;

namespace MvcMovie.Models
{
    public class Test
    {
        public int ID { get; set; }
        public string name { get; set; }
    }
}

然后(在“控制器”中)我有一个新控制器“HelloWorldController”。在这个我有这个功能:

    public ActionResult Index()
    {
        DataSet data;
        DataTable table;

        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            connection.Open();

            SqlCommand select = new SqlCommand("SELECT * FROM Test", connection);

            SqlDataAdapter adapter = new SqlDataAdapter();
            adapter.SelectCommand = select;

            data = new DataSet();
            adapter.Fill(data, "Test");

            table = data.Tables[0]; //is the [0] really correct?
        }

        return View(/* HOW DO I GET THE TABLE TO THE VIEW? */);
    }

现在我想在我的“Index.cshtml”文件(在“视图”中)显示表格的行。如何将表格从控制器获取到视图?我发现的是“@model”和“IEnumerable”,但这不起作用,因为我无法转换我的表格。

@model IEnumerable<MyProject.Models.Test>

@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>

@foreach (var item in Model) {
    <p>blaaaah</p>
}

现在有三个问题:
1. 我做错了什么吗? (DB-Access 的方法,..)
2. 有没有更简单的方法来做到这一点? (没有所有适配器,.. 东西)
3. 如果!1&&!2,我如何让它工作? (获取视图文件以“了解”我的表)

感谢您的帮助,
问候,
卡巴

【问题讨论】:

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


    【解决方案1】:

    我建议您使用视图模型并摆脱数据集和表。让我们忘记那些数据类型。它们是遗产。

    例如,您可以有一个方法(您最终会将其外部化到存储库中,以避免使用数据库访问污染您的控制器代码):

    public IEnumerable<Test> GetTests()
    {
        using (var conn = new SqlConnection(connectionString))
        using (var cmd = conn.CreateCommand())
        {
            conn.Open();
            cmd.CommandText = "SELECT ID, name FROM Test";
            using (var reader = cmd.ExecuteReader())
            {
                while (reader.Read())
                {
                    yield return new Test
                    {
                        ID = reader.GetInt32(reader.GetOrdinal("ID")),
                        name = reader.GetString(reader.GetOrdinal("name")),
                    }
                };
            }
        }
    
    }
    

    然后是你的控制器动作:

    public ActionResult Index()
    {
        IList<Test> tests = GetTests().ToList();
        return View(tests);
    }
    

    到目前为止一切顺利。最后对应的强类型视图来显示结果:

    @model IList<Test>
    <table>
        <thead>
            <tr>
                <th>ID</th>
                <th>Name</th>
            </tr>
        </thead>
        <tbody>
            @for (var i = 0; i < Model.Count; i++)
            {
                <tr>
                    <td>@Html.DisplayFor(x => x[i].ID)</td>
                    <td>@Html.DisplayFor(x => x[i].name)</td>
                </tr>
            }
        </tbody>
    </table>
    

    如果您愿意,也可以使用 WebGrid 助手:

    @model IList<Test>
    @{
        var grid = new WebGrid(Model);
    }
    @grid.GetHtml()
    

    【讨论】:

    • 感谢您的详细说明。我真的很喜欢你的解决方案。到目前为止,我从未见过那种“产量”._。但这不是一个真正的问题。我已经重写了我的东西(变化不是那么大)以匹配你的结构,我对结果很满意。非常感谢。
    • 只是一个想法...我怀疑yield return 是否是一件好事。返回IList&lt;Test&gt;而不是IEnumerable&lt;Test&gt;不是更好吗?使用yield return有优势吗?
    • @KSK,使用迭代器可以让您延迟加载数据集。例如,如果您只需要在视图中显示前 50 行,那么将所有结果加载到内存中并将它们丢弃是完全浪费的。显然,在我的示例中,我正在迭代视图中的所有结果,但在现实世界的应用程序中,您可能想要进行一些分页。
    猜你喜欢
    • 1970-01-01
    • 2014-06-03
    • 2016-04-12
    • 2013-06-21
    • 2020-09-20
    • 2016-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多