2012-05-02 113 views
4

我一直在尝试在我的ASP.NET MVC项目中使用预先存在的数据库。我为我的(Microsoft SQL)数据库(“。\ SQLEXPRESS.Databases”)创建了一个“数据连接”,它具有表“Test”。该表有两列“ID(int)”和“name(nvarchar(MAX))”。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”文件显示表中的行(在“意见”)。我如何从Controller获取表格到视图?我发现的是“@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,我该如何使它工作? (获取视图文件“知道”我的表)

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

回答

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

只是一个想法...我怀疑'收益回报'是否是一件好事。返回IList 而不是IEnumerable '是不是更好?使用“收益回报”有没有优势? – KSK

+1

@KSK,使用迭代器允许您延迟加载数据集。例如,如果您只需要显示视图中的前50行,那么将所有结果加载到内存中并将其全部扔掉将是一项完全浪费。很明显,在我的例子中,我重复了视图中的所有结果,但在真实世界的应用程序中,您可能想要做一些分页。 –