MVC+LINQ+EF實戰(.NET平臺)
學習軟體開發的重點是動手實踐,只是站在河邊學習動作要領和游泳理論,是永遠學不會游泳的,你一定要下水試試。這次例項練習主要涉及了三個核心知識,一個是MVC框架,一個是EntityFramework,還有一個就是Linq。
第一步:新建專案,建立一個基於MVC的應用程式,如下圖所示:
第二步:在Model層建立edmx檔案及其附屬類,這裡要用到EF。簡單來介紹一下EF吧,EF就是EntityFrameWork,即ORM(ObjectRelationalMapping)物件關聯式資料庫對映框架,根據實體物件運算元據表中資料的一種物件導向的操作框架。下面我們來看如何用實體物件對映資料庫表的資料:
在我的SQL Server中有事先建好的幾張表如下圖所示,我們主要對news表進行操作
在Models資料夾右擊新增新建項,在對話方塊的左邊列表中選擇資料,之後在右邊的列表中選擇ADO.NET實體資料模型,如下圖所示:
經過上述所示的一系列操作,我們會看到系統為我們建立的edmx檔案的圖形化顯示以及檔案組織結構如下圖
在解決方案資源管理器中的Models檔案下可以看到這個檔案及其子檔案的組織結構,具體每個檔案的作用和原理在這裡不再說明,大家感興趣可以自己研究。
第三步:進行程式碼編寫,主要是對Controller進行設計和編碼,需要寫程式碼的主要有三個檔案,分別是HomeController.cs、Index.cshtml和Modify.cshtml,分別給出如下:
HomeController.cs的程式碼如下:
<span style="font-size:18px;">namespace MVCBlog.Controllers
{
public class HomeController : Controller
{
/// <summary>
/// 資料上下文物件
/// </summary>
newssystemEntities db = new newssystemEntities();
#region 查詢新聞列表+ActionResult Index()
/// <summary>
/// 查詢新聞列表
/// </summary>
/// <returns></returns>
public ActionResult Index()
{
//1.查詢資料庫裡的新聞資料(通過EF執行)
//1.1第一種方法:使用SQO(標準查詢運算子),查詢所有新聞
//db.news.Where(d =>d.id !=0 );
//List<Models.news> list = db.news.Where(d => d.id != 0).ToList ();
//1.2第二種方法:使用linq語句,查詢所有新聞標題
//Linq僅僅是給程式設計師使用的語法糖,.net編譯器會在編譯時將linq轉化為sqo
List <Models.news> list = (from d in db.news where d.id != 0 select d).ToList ();
//2.將資料集合傳給檢視
ViewData["datalist"] = list;
//3.載入檢視
return View();
}
#endregion
#region 執行刪除操作(根據id)+ActionResult Del(int id)
/// <summary>
/// 執行刪除操作(根據id)
/// </summary>
/// <param name="id">要刪除的新聞id</param>
/// <returns></returns>
public ActionResult Del(int id)
{
try
{
//1.建立要刪除的物件
news modelDel = new news() { id = id };
//2.將物件新增到EF管理容器中
db.news.Attach(modelDel);
//3.將物件包裝類的狀態標識為刪除狀態
db.news.Remove(modelDel);
//4.更新到資料庫
db.SaveChanges();
//5.更新成功,則令瀏覽器跳轉到list方法
return RedirectToAction("Index","Home");
}
catch (Exception ex)
{
return Content("刪除失敗!"+ex .Message );
}
}
#endregion
#region 顯示要修改的資料(根據id)+ActionResult Modify(int id)
[HttpGet ]
/// <summary>
/// 執行修改操作(根據id)
/// </summary>
/// <param name="id">要修改的新聞id</param>
/// <returns></returns>
public ActionResult Modify(int id)
{
try
{
//根據id查詢資料庫,返回集合中,拿到第一個實體物件
news n = (from a in db.news where a.id == id select a).FirstOrDefault();
//生成分類下拉框列表集合List<SelectListItem> list
IEnumerable <SelectListItem> listitem = (from c in db.categories select c ).ToList (). Select (c=> new SelectListItem {Value =c.id .ToString (),Text =c.name });
ViewBag.CateList = listitem;
//將n傳遞給檢視顯示 viewbag 或者viewdata
//載入檢視,使用view的建構函式 將資料傳給檢視上的名為model的屬性
return View(n);
}
catch (Exception ex)
{
return Content("修改失敗!" + ex.Message);
}
}
#endregion
#region 執行修改操作+ActionResult Modify(news model)
[HttpPost ]
/// <summary>
/// 執行修改操作
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public ActionResult Modify(news model)
{
try
{
//將實體物件加入到EF物件容器中,並獲取偽包裝類物件
DbEntityEntry<news> entry = db.Entry<news>(model);
//將包裝類物件的狀態設定為unchanged
entry.State = System.Data.EntityState.Unchanged;
//設定需要提交的實體屬性
entry.Property(a => a.title).IsModified = true;
entry.Property(a => a.content).IsModified = true;
//提交到資料庫 完成修改
db.SaveChanges();
//5.更新成功,則令瀏覽器跳轉到list方法
return RedirectToAction("Index", "Home");
}
catch (Exception ex)
{
return Content("修改失敗!" + ex.Message);
}
}
#endregion
}
}</span>
Index.cshtml的程式碼如下:
<span style="font-size:18px;">@using MVCBlog.Models
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<title>Index</title>
<style type ="text/css" >
#tblist
{
border :1px solid #0ff;
width :800px;
margin :10px auto ;
border-collapse :collapse ;
}
#tblist th,td
{
border :1px solid #0ff;
padding :10px;
}
</style>
<script type ="text/javascript" >
function Del(id) {
alert("執行到了這裡");
if (confirm("您確定要刪除嗎?親~~")) {
window.location="/Home/Del/" + id;
}
}
function Modify(id) {
window.location = "/Home/Modify/" + id;
}
</script>
</head>
<body>
<table id ="tblist" >
<tr>
<th >id</th>
<th >標題</th>
<th >釋出時間</th>
<th >新聞分類</th>
<th >操作</th>
</tr>
<!--遍歷Action方法 設定給viewdata的資料集合,生成html程式碼-->
@foreach (news n in ViewData["datalist"] as List<news>)
{
<tr>
<td>@n.id </td>
<td >@n.title </td>
<td>@n.createTime </td>
<td >@n.category.name </td>
<td >
<a href ="javascript:Del(@n.id) ">刪除</a>
<a href ="javascript:Modify(@n.id )">修改</a>
</td>
</tr>
}
</table>
</body>
</html></span>
Modify.cshtml的程式碼如下:
<span style="font-size:18px;">@model MVCBlog .Models .news
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<title>修改</title>
<style type ="text/css" >
#tblist
{
border :1px solid #0ff;
width :600px;
margin :10px auto ;
border-collapse :collapse ;
}
#tblist th,td
{
border :1px solid #0ff;
padding :10px;
}
</style>
</head>
<body>
@using (Html.BeginForm("Modify", "Home", FormMethod.Post))
{
<table id="tblist">
<tr>
<td colspan ="2">修改 @Html.HiddenFor(a =>a.id)</td>
</tr>
<tr>
<td >標題:</td>
@*<td >@Html.TextBox("txtName",(object )Model.title)</td>*@
<!--使用htmlhelper的強型別方法直接從model中根據title屬性生成文字框-->
<td>@Html.TextBoxFor(a=>a.title )</td>
</tr>
<tr>
<td>分類:</td>
<td >@Html.DropDownListFor(a=>a .category ,ViewBag.CateList as IEnumerable <SelectListItem >)</td>
</tr>
<tr>
<td >內容:</td>
<td>@Html.TextAreaFor(a=>a.content,10,60,null )</td>
</tr>
<tr>
<td colspan="2"><input type ="submit" value ="確定修改" />@Html.ActionLink("返回","Index","Home")</td>
</tr>
</table>
}
</body>
</html></span>
第四步,執行程式,我們要實現的是對news表的查詢、刪除和修改,通過主檢視Index來顯示news表中的所有新聞,然後通過連結進行新聞的刪除和修改,執行的截圖如下
最後提一下這個Linq,沒聽說過的小夥伴們可能會有困惑。所謂Linq就是語言整合查詢, 是 Visual Studio 2008 和 .NET Framework 3.5版中引入的一項創新功能,它在物件領域和資料領域之間架起了一座橋樑。Linq僅僅是給程式設計師使用的語法糖,.net編譯器會在編譯時將linq轉化為SQO,而這個SQO是定義在System.Linq.Enumerable類中的50多個為IEnumerable<T>準備的擴充套件方法,這些方法用來對它操作的集合進行查詢篩選,所以說我們本質上是在使用SQO進行查詢。
總結一下這個例項的要點,首先要熟悉MVC框架,這個一般沒什麼問題,其次要會建立實體框架,這個熟練了也沒什麼問題,在本例中我覺得最核心的東西是Controller的編寫,那裡要用到很多的知識,比如如何建立物件,將操作物件新增到EF管理容器中等。此外在分佈檢視中還要用到HtmlHelper物件的強型別方法直接根據model的屬性生成html控制元件,當然這個強型別方法的很多引數還不太熟練,有待進一步的學習。
相關文章
- 高可用Hadoop平臺-實戰Hadoop
- 小程式實戰:線上借書平臺
- ElasticSearch實戰-日誌監控平臺Elasticsearch
- .NET平臺系列10 .NET統一平臺願景
- .NET平臺系列13 .NET5 統一平臺
- NET平臺下TCP實現IOCP例子TCP
- django實戰專案課程平臺搭建Django
- 微軟開源 .NET 框架 實現跨平臺微軟框架
- .NET Core 跨平臺
- 高可用Hadoop平臺-實戰尾聲篇Hadoop
- 將死的平臺:.Net
- Django+Vue+Docker搭建介面測試平臺實戰DjangoVueDocker
- FastAPI專案實戰:"非同步"介面測試"平臺"ASTAPI非同步
- Flutter實戰(三)檢驗Flutter的跨平臺能力Flutter
- 【穩定性平臺】GOREPLAY流量錄製回放實戰Go
- 美團點評資料平臺Kerberos優化實戰ROS優化
- Active Network實踐:構建Kubernetes平臺的最佳工具
- .NET平臺系列5 .NET Core 簡介
- .NET 使用 .NET Core 跨平臺執行
- 七牛大資料平臺的實時資料分析實戰大資料
- 情指勤融合實戰平臺開發解決方案,智慧公安警務平臺建設
- 測試平臺系列(85) 把redis運用到實戰中Redis
- 高可用Hadoop平臺-Flume NG實戰圖解篇Hadoop圖解
- onethink支援跨平臺嗎
- .Net平臺的GC垃圾回收GC
- .NET平臺下開源框架框架
- .NET Core 跨平臺釋出
- 打造跨平臺.NET Core後臺服務
- Spark實時計算的開發平臺RCS——阿里流式分析實戰Spark阿里
- 資料視覺化平臺搭建,警務實戰平臺大資料應用視覺化大資料
- Tungsten Fabric實戰:對接vMX虛擬路由平臺填坑路由
- 資訊化實戰展示系列2 **市**區辦公雲平臺
- 前端之React實戰:建立跨平臺的專案架構前端React架構
- .NET跨平臺實踐:.NetCore、.Net5/6 Linux守護程式設計NetCoreLinux程式設計
- [平臺建設] HBase平臺建設實踐
- .NET6 平臺系列3 .NET CLR 詳解
- .NET6 平臺系列4 .NET開源之路
- .NET平臺系列8 .NET Core 各版本新功能