這一篇要透過 MVC 建立與 Web Form 相同的功能,針對關聯式資料庫進行資料查詢作業,如果對MVC不熟悉,請先參考第一次使用 MVC系列中的「第一次使用 MVC – 從控制器開始」開始與「第一次使用 MVC – 建立檢視頁面」,而這裏所使用的ADO.NET程式碼與相關的範例資料來源,請參考本系列的第一篇,現在假設你具備了所有相關的知識,這裏直接來看範例。
建立一個MVC專案MVC_ADONET,於其中的Models資料夾裏面,建立一個TCategoris.cs類別,提供資料來源如下:
這個類別中定義了 GetProducts() 函式,回傳自資料庫取得的 EnumerableRowCollection<DataRow> 資料物件,封裝所要查詢的資料內容。現在移至 Controllers資料夾,於其中新增一個控制器類別 CategoriesController.cs ,建立以下的程式碼:
其中的程式碼透過 Models.TCategoris() 取回資料,經由 LINQ 進一步萃取資料進行回傳,然後將封裝資料內容的 table 變數設定給 ViewBag 的 Table 。最後建立對應的 View 檔案 Index.cshtml ,配置如下的內容:
其中透過 ViewBage.Table 取得控制器傳入的資料,並且將其轉換成為DataRow 型別的 IEnumerable 物件,緊接著於 foreach 迴圈中,將資料逐一取出。以下為此範例的執行結果:
如你所見,我們順利的透過ADO.NET將資料從Model層取出,然後透過View呈現,要注意的是,MVC比較好的作法是透過 Entity Framework 進行資料的存取操作,這一篇文章純粹是為了延續此系列的比較說明而寫的,請持續參考閱讀 第一次使用 MVC – 建立 Model(1)這一篇開始針對MVC+Entity Framework 的議題討論。
結束之前順便提醒一下, 在上面 View 的程式碼中,預先透過鑄型將 ViewBag.Table 取得的結果資料,轉型成為 IEnumerable<System.Data.DataRow> 以方便接下來的存取操作,這一部份只是為了示範而省略了實體類別的實作,如果你一定要在MVC中使用ADO.NET而非Entity Framework 這一類的資料模型框架,請參考LINQ 與資料存取 (3) - 透過 LINQ 轉換 DataSet 形成可序列化資料這一篇,建立自己的對應實體類別。
建立一個MVC專案MVC_ADONET,於其中的Models資料夾裏面,建立一個TCategoris.cs類別,提供資料來源如下:
namespace MVC_ADONET.Models
{
public class TCategoris
{
public EnumerableRowCollection<DataRow> GetProducts()
{
SqlConnection conn = new SqlConnection(
@"Server=Tim-PC;DataBase …");
string sql =
"SELECT CategoryID,CategoryName,Description FROM Categories";
DataSet ds = new DataSet();
using (conn)
{
SqlDataAdapter adapter = new SqlDataAdapter(sql, conn);
adapter.Fill(ds, "Categories");
}
EnumerableRowCollection<DataRow> table = ds.Tables[0].AsEnumerable();
return table ;
}
}
}
這個類別中定義了 GetProducts() 函式,回傳自資料庫取得的 EnumerableRowCollection<DataRow> 資料物件,封裝所要查詢的資料內容。現在移至 Controllers資料夾,於其中新增一個控制器類別 CategoriesController.cs ,建立以下的程式碼:
namespace MVC_ADONET.Controllers
{
public class CategoriesController : Controller
{
public ActionResult Index()
{
Models.TCategoris c = new Models.TCategoris();
IEnumerable<System.Data.DataRow> table =
from row in c.GetProducts()
select row;
ViewBag.Table = table;
return View();
}
}
}
其中的程式碼透過 Models.TCategoris() 取回資料,經由 LINQ 進一步萃取資料進行回傳,然後將封裝資料內容的 table 變數設定給 ViewBag 的 Table 。最後建立對應的 View 檔案 Index.cshtml ,配置如下的內容:
@{
ViewBag.Title = "Index";
}
<h2>分類項目清單</h2>
<ul>
@{
var table =(IEnumerable<System.Data.DataRow>) ViewBag.Table;
foreach (System.Data.DataRow row in table)
{
<li><span><b>@row["CategoryID"]:</b></span>
<span>@row["CategoryName"]</span>
<p>@row["Description"]</p>
</li>
}
}
</ul>
其中透過 ViewBage.Table 取得控制器傳入的資料,並且將其轉換成為DataRow 型別的 IEnumerable 物件,緊接著於 foreach 迴圈中,將資料逐一取出。以下為此範例的執行結果:
如你所見,我們順利的透過ADO.NET將資料從Model層取出,然後透過View呈現,要注意的是,MVC比較好的作法是透過 Entity Framework 進行資料的存取操作,這一篇文章純粹是為了延續此系列的比較說明而寫的,請持續參考閱讀 第一次使用 MVC – 建立 Model(1)這一篇開始針對MVC+Entity Framework 的議題討論。
結束之前順便提醒一下, 在上面 View 的程式碼中,預先透過鑄型將 ViewBag.Table 取得的結果資料,轉型成為 IEnumerable<System.Data.DataRow> 以方便接下來的存取操作,這一部份只是為了示範而省略了實體類別的實作,如果你一定要在MVC中使用ADO.NET而非Entity Framework 這一類的資料模型框架,請參考LINQ 與資料存取 (3) - 透過 LINQ 轉換 DataSet 形成可序列化資料這一篇,建立自己的對應實體類別。
沒有留言:
張貼留言