其實在學校時,已經開設了MVC這門課程,教材由授課老師自己編纂,是和微軟的音樂商店相似的一個書店項目,當時無法理解 Linq、Lambda , 只記得是按照老師的方法,復制+粘貼,不明其意,亦不知其理。心里模糊有個印象,后來在頂崗實習時候接觸的(GIS)地理測繪方面的開發維護,直到換工作轉正后,趁著為后期開發作技術儲備的機會,好好從頭開始學習一下MVC
MVC是一種高級架構模式,由于先學習的Web Form,剛開始總覺的MVC 的顯示分離增加了應用程序的復雜性,很不好用。當時真是鼠目寸光。沒有見識到 -模型-視圖-控制器- 的強大之處。分層、簡潔、易于維護
模型:一組實體類,可以理解為“數據層” 。 視圖:定義用戶顯示的界面,被控制器來指定。 控制器:訪問指引處,用來處理來自用戶的請求,以及整個應用程序流的通信
Razor語法:易于輸入,支持所有的文本編輯器、智能感應、自識別@郵箱/@屬性
下面記一個簡單的表格操作,最后的效果圖如下:
關于上面這個Demo,分三部分介紹:
1.CSS樣式引用
① 在MVC中,若引用了模板頁,會在默認的模板頁中看到 @Styles.Render("~/Content/css") ,這里是引用CSS樣式配置源,在 文件夾 App_Start 下找到 BundleConfig.cs , 點開后找到
bundles.Add(new StyleBundle("~/Content/css").Include("~/Content/Site.css"));
沒錯這里就是引用的CSS樣式表,如果此時需要引用 bootstrap.min.css 樣式,直接以 Include("","",...)的形式加入進去,只是需要注意的是,這里瀏覽器進行編譯時,無法識別壓縮的css文件,只有將 min 去掉,如重命名 bootstrap.css 才可以
② 此時,瀏覽器編譯后的界面如下
2.分頁控件
①下載并安裝網上開源的分頁控件的Nuget包,在控制器界面引用控件的命名空間 using Webdiyer.WebControls.Mvc;
②同樣在視圖界面引用命名空間,還需引用@model PagedList<實體類名(表名)>
注:視圖界面只允許存在一個@model 的引用,如果之前選擇創建強類型視圖,需要注釋此強類型部分,然后再添加@model 項目名.Models
3.增刪該查
增刪改查是對數據最基礎的操作,歸根結底,也仍然是離不開參數的傳遞,以編輯為例子, 當前臺點擊編輯時,傳遞該學生的 id ,并提交到設定的控制器中,控制器接收參數,進行判斷,然后返回編輯界面的視圖,編輯界面點擊保存,傳遞學生對象到控制器,控制器再根據Linq完成對數據的操作,返回主視圖
編輯:
① 在主界面的視圖頁中,編輯功能下傳遞當前選中行的學生id,
跳轉格式: @Html.ActionLink("連接文本", "方法","參數")
@Html.ActionLink("編輯", "Edit", new { id=item.Stu_id})
② 在對應的控制器下,接收視圖傳遞進來的學生id ,進行判斷,若有值,則返回至編輯視圖
//全局變量 數據對象 private IBBCEntities db = new IBBCEntities(); // // GET: /Default1/Edit/5 public ActionResult Edit(int id) { Students students = db.Students.Find(id); if (students == null) { return HttpNotFound(); } return View(students); }
③ 在編輯視圖中,添加提交按鈕 <input type="submit" value="Save" />
設置 Post 的請求方式 @using (Html.BeginForm("Edit","Default",FormMethod.Post)) { <></>... }
其中Html.BeginForm("方法名", "控制器名", "請求方式")
也可以寫成 @using (Html.BeginForm()) { @Html.ValidationSummary(true) <></>.... }
這種寫法,使用的是默認方式(自動提交到對應控制器下的同(類)名的并且帶有[HttpPost]方法下,且提交方式為 post)
④ 在后臺控制器中,利用 Linq 來操作數據,完成后仍返回主視圖
[HttpPost] public ActionResult Edit(Students students) { if (ModelState.IsValid) { db.Entry(students).State = EntityState.Modified; db.SaveChanges(); return RedirectToAction("Index"); } return View(students); }
作了一個編輯的說明,只要稍稍了解過 Linq ,就不難想出 創建、刪除、查看的方法
對于刪除,傳遞的id ,即根據id(主鍵)來執行刪除操作,思路:查詢由視圖傳提交來的id 的學生對象,然后刪除對象,保存
// POST: /Default1/Delete/5 [HttpPost, ActionName("Delete")] public ActionResult DeleteConfirmed(int id) { Students students = db.Students.Find(id); db.Students.Remove(students); db.SaveChanges(); return RedirectToAction("Index"); }
對于創建,先驗證添加的對象是否合理,合理:添加,保存。
// POST: /Default1/Create [HttpPost] public ActionResult Create(Students students) { if (ModelState.IsValid) { db.Students.Add(students); db.SaveChanges(); return RedirectToAction("Index"); } return View(students); }
對于以上操作,實際上在項目中是根本不會直接拿過來用的,對于CURD這些操作,往往是先定義好倉儲接口,然后用對應的實體接口去繼承,再去基類中實現這些方法,最后在邏輯中調用。可直接傳入對應的實體和方法名,即可完成邏輯操作。針對傳統的DBhelper操作而言,不用每每實現一個數據庫的功能都要去手寫sql語句。尤其對于大項目而言,頻繁的手寫sql語句,浪費大量的時間和精力。
權當作學習記錄
文章列表