2012-05-02 16 views
4

私はASP.NET MVCプロジェクトで既存のデータベースを使用しようとしています。私は私の(Microsoft SQL)データベース( "。\ SQLEXPRESS.Databases")に "Test"というテーブルを持つ "Data Connection"を作成します。このテーブルには、 "ID(int)"と "name(nvarchar(MAX))"の2つの列があります。私はこの新しいクラスを入れて「モデル」フォルダにASP.NET MVCデータベースへのアクセス

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"でしたが、テーブルを変換できないので動作しません。私は完全に間違って何かをやって
1.アム:

@model IEnumerable<MyProject.Models.Test> 

@{ 
    ViewBag.Title = "Index"; 
} 

<h2>Index</h2> 

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

は今3つの質問がありますか? (DB-Accessの方法)
2.簡単な方法がありますか? (すべてのアダプタがなくても)
3. 1!& &!2の場合、どうすれば動作させることができますか? (私のテーブルを「知る」ためにビューファイルを入手)の助けを

おかげで、
よろしく、
CABA

答えて

12

は、私は、ビューモデルを使用して、あなたをお勧めしたいとデータセットとテーブルを取り除きます。これらのデータ型を忘れてみましょう。彼らは遺産です。あなたは(あなたが最終的にはデータベースアクセスを使用してコントローラのコードを汚染を避けるためにrepositorhyに外部化します)メソッドを持つことができます。例えば

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() 
+0

は、詳細な指示をいただき、ありがとうございます。私はあなたのソリューションが本当に好きです。今までは、 "収穫"は見たことがありません。それは本当に問題ではありません。私はあなたの構造に合うように私のものを書き換えました(変更はそれほど大きくありませんでした)。結果​​にはかなり満足しています。どうもありがとう。 – Cabadath

+0

ちょっと考えました。「利回りリターン」が良いことであるかどうかは疑問です。 'IEnumerable 'の代わりに 'IList 'を返すほうがいいですか? 'yield return'の使用に利点がありますか? – KSK

+1

@KSK、イテレータを使用すると、データセットを遅延ロードすることができます。たとえば、ビューの最初の50行だけを表示する必要がある場合は、すべての結果をメモリにロードしてスローするのは無駄です。明らかに私の例では、ビュー内のすべての結果を反復処理していますが、実際のアプリケーションでは、おそらくページ分割をしたいと思っています。 –

関連する問題