4

ASP.NET MVC プロジェクトで既存のデータベースを使用しようとしています。テーブル「Test」を持つ (Microsoft SQL) データベース (「.\SQLEXPRESS.Databases」) への「データ接続」を作成します。このテーブルには、「ID (int)」と「名前 (nvarchar(MAX))」の 2 つの列があります。

「Models」フォルダーに、この新しいクラスを配置しました。

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

ここで 3 つの質問があります:
1. 私は何か完全に間違っているのでしょうか? (DB-Access の方法、..)
2. これを行う簡単な方法はありますか? (すべてのアダプターなしで、.. もの)
3. !1&&!2 の場合、どうすれば動作させることができますか? (ビューファイルを取得してテーブルを「知る」)

助けてくれてありがとう、
よろしく、
カバ

4

1 に答える 1

13

ビュー モデルを使用し、DataSet と Table を削除することをお勧めします。これらのデータ型については忘れましょう。それらはレガシーです。

たとえば、メソッドを持つことができます (データベース アクセスでコントローラー コードを汚染するのを避けるために、最終的にリポジトリに外部化します)。

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()
于 2012-05-02T14:41:41.507 に答える