MVC5 + EF6 + Bootstrap3 (13) 查看詳情、編輯數據、刪除數據


Slark.NET-博客園 http://www.cnblogs.com/slark/p/mvc5-ef6-bs3-get-started-rud.html 

系列教程:MVC5 + EF6 + Bootstrap3

上一節:MVC5 + EF6 + Bootstrap3 (12) 新建數據

下一節:MVC5 + EF6 + Bootstrap3 (14) 分部視圖PartialView

源碼下載:點我下載

目錄

前言

所謂萬事開頭難,前面用兩節介紹了查詢頁面,一節介紹了創建數據。由於前面做了大量的鋪墊,本節就能順利的將查看詳情、編輯數據、刪除數據在一節中全部介紹給大家。前后這幾節加起來就完成了一個簡單信息系統的增刪改查(CRUD)的所有操作。

添加鏈接

要進行這三個操作,首先在查詢頁面的每一條記錄后面添加對應的鏈接。代碼如下:

<tr>
    <td>
        @Html.DisplayFor(modelItem => item.FirstName)
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.LastName)
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.Sex)
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.Rating)
    </td>
    <td> @Html.ActionLink("Details","Details", new { id = item.ID }) | 
        @Html.ActionLink("Edit", "Edit" , new { id = item.ID }) | 
        @Html.ActionLink("Delete", "Delete", new { id = item.ID })
    </td>
</tr>

上面代碼對應着數據列表的一行,其中黃色的部分就是我們添加的鏈接。這三個鏈接對應三個不同的操作,他們都需要ID作為參數來確定操作的是哪一條數據,改動后的頁面顯示如下:

紅框部分就是我們添加的鏈接。

查看詳情

查看詳情對應Details鏈接。點擊鏈接之后會請求當前Contoller,也就是CompanyController的Details Action。那么我們就在~\Controllers\CompanyController.cs下寫這個Action。代碼如下:

 1 public ActionResult Details(int? id)
 2 {
 3     if (id == null)
 4     {
 5         return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
 6     }
 7     Worker worker = db.Workers.Find(id);
 8     if (worker == null)
 9     {
10         return HttpNotFound();
11     }
12     return View(worker);        
13 }

第3-6行表示如果訪問這個Actions時沒有給參數id則返回BadRequest錯誤。如下圖所示,地址欄里面沒有給出ID,返回Bad Request錯誤。

第7-11行表示如果根據id沒有找到對應的信息則返回HttpNotFound錯誤,如下圖所示:

第12行,如果根據id找到了對應的信息則用View顯示。

在~Views\Company\下創建Details.cshtml視圖,寫入代碼如下:

 1 @model SlarkInc.Models.Worker
 2 @{
 3     ViewBag.Title = "Details";
 4 }
 5 <h2>Worker Details</h2>
 6 <div>
 7     <h4>Worker</h4>
 8     <hr />
 9     <dl class="dl-horizontal">
10         <dt>
11             @Html.DisplayNameFor(model => model.FirstName)
12         </dt>
13         <dd>
14             @Html.DisplayFor(model => model.FirstName)
15         </dd>
16         <dt>
17             @Html.DisplayNameFor(model => model.LastName)
18         </dt>
19         <dd>
20             @Html.DisplayFor(model => model.LastName)
21         </dd>
22         <dt>
23             @Html.DisplayNameFor(model => model.Sex)
24         </dt>
25         <dd>
26             @Html.DisplayFor(model => model.Sex)
27         </dd>
28         <dt>
29             @Html.DisplayNameFor(model => model.Rating)
30         </dt>
31         <dd>
32             @Html.DisplayFor(model => model.Rating)
33         </dd>
34     </dl>
35 </div>
36 <p>
37     @Html.ActionLink("Edit", "Edit", new { id = Model.ID }) |
38     @Html.ActionLink("Back to List", "Index")
39 </p>

代碼中用DisplayNameFor函數顯示屬性名,用DisplayFor函數顯示屬性值。

頁面用<dl><dt><dd>和Bootstrap的"dl-horizontal"類布局頁面,使每一個屬性名和屬性值占一行,顯示效果如下:

第37行給出了編輯此頁面的鏈接。38行給出返回查詢頁面的鏈接。

編輯數據

在~\Controllers\CompanyController.cs中加入用來進入Edit頁面的Action代碼如下:

public ActionResult Edit(int? id)
{
    if (id == null)
    {
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
    }
    Worker worker = db.Workers.Find(id);
    if (worker == null)
    {
        return HttpNotFound();
    }
    return View(worker);
}

看起來眼熟?沒錯,和Details的Action是一模一樣的,這里就不重復了。

下面寫View。在~\Views\Company\下創建Edit.cshtml視圖,寫入代碼如下:

 1 @model SlarkInc.Models.Worker
 2 @{
 3     ViewBag.Title = "Edit";
 4 }
 5 <h2>Worker Edit</h2>
 6 @using (Html.BeginForm())
 7 {
 8     @Html.AntiForgeryToken()
 9     <div class="form-horizontal">
10         <hr />
11         @Html.ValidationSummary(true)
12         @Html.HiddenFor(model => model.ID) 13         <div class="form-group">
14             @Html.LabelFor(model => model.FirstName, new { @class = "control-label col-md-2" })
15             <div class="col-md-10">
16                 @Html.EditorFor(model => model.FirstName)
17                 @Html.ValidationMessageFor(model => model.FirstName)
18             </div>
19         </div>
20         <div class="form-group">
21             @Html.LabelFor(model => model.LastName, new { @class = "control-label col-md-2" })
22             <div class="col-md-10">
23                 @Html.EditorFor(model => model.LastName)
24                 @Html.ValidationMessageFor(model => model.LastName)
25             </div>
26         </div>
27         <div class="form-group">
28             @Html.LabelFor(model => model.Sex, new { @class = "control-label col-md-2" })
29             <div class="col-md-10">
30                 @Html.EnumDropDownListFor(model => model.Sex)
31                 @Html.ValidationMessageFor(model => model.Sex)
32             </div>
33         </div>
34         <div class="form-group">
35             @Html.LabelFor(model => model.Rating, new { @class = "control-label col-md-2" })
36             <div class="col-md-10">
37                 @Html.EditorFor(model => model.Rating)
38                 @Html.ValidationMessageFor(model => model.Rating)
39             </div>
40         </div>
41         <div class="form-group">
42             <div class="col-md-offset-2 col-md-10">
43                 @Html.Submit("Submit")
44             </div>
45         </div>
46     </div>
47 }
48 <div>
49     @Html.ActionLink("Back to List", "Index")
50 </div>

這個頁面的代碼與上一節的插入數據頁面的代碼基本相同,可以參照上一節的代碼說明,需要看的點這里

第12行用HiddenFor函數儲存當前要修改的記錄的ID以便提交后找到對應的記錄進行更新。

頁面顯示如下:

接下來我們來寫提交更新數據之后需要訪問的Action,在~\Controllers\Company.cs中加入用Post方法訪問的Edit Action,代碼如下:

 1 [HttpPost]
 2 [ValidateAntiForgeryToken]
 3 public ActionResult Edit([Bind(Include = "ID, FirstName, LastName, Sex, Rating")] Worker worker)
 4 {
 5     if (ModelState.IsValid)
 6     {
 7         db.Entry(worker).State = EntityState.Modified;  8         db.SaveChanges();
 9         return RedirectToAction("Index");
10     }
11     return View(worker);
12 }

這段帶碼的知識點講解與上一節Create提交Action的基本相同,點擊這里查看

不同點是第7行,根據獲得的worker實例,在數據列表中找到對應記錄,更新其值,並設置其狀態為Modified。最后將改動保存到數據庫並跳轉回數據查詢頁面。

刪除數據

刪除數據不需要頁面顯示數據,只需在CompanyController下加入一個Delete Action刪除數據即可,代碼如下:

 1 public ActionResult Delete(int id)
 2 {
 3     try
 4     {
 5         Worker workerToDelete = new Worker() { ID = id };
 6         db.Entry(workerToDelete).State = EntityState.Deleted;
 7         db.SaveChanges();
 8     }
 9     catch(DataException/*dex*/)
10     {
11         return RedirectToAction("Index", new { id = id, saveChangesError = true });
12     }
13     return RedirectToAction("Index");
14 }

第5行創建一個只有ID被賦值的worker實例。然后第6行根據這個實例的ID在數據庫中找到對應的數據,設置其狀態為Deleted已刪除,第7行執行刪除操作。

如果刪除成功則在第13行跳轉回查詢頁面,如果失敗則跳轉回查詢頁面並傳遞兩個參數傳遞失敗記錄的ID及saveChangesError = true。根據這兩個傳遞的參數可以在查詢頁面寫出錯誤信息。這里就不詳細描述了。

這樣點擊刪除鏈接就能在查詢頁面看到那條數據被刪除了。

結尾

到此,我們完成了對一個簡單數據模型的增刪改查操作。不過其中還有很多知識點沒有詳細描述,比如數據驗證、EF操作數據的函數、View中的各種不同的Http響應等等。后面會一一詳細介紹。

覺得有用就推薦下吧!

本節主要參考:Implementing Basic CRUD Functionality with the Entity Framework in ASP.NET MVC Application

上一節:MVC5 + EF6 + Bootstrap3 (12) 新建數據

下一節:MVC5 + EF6 + Bootstrap3 (14) 分部視圖PartialView

作者:Slark.NET

出處:http://www.cnblogs.com/slark/

本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。如有問題或建議,請多多賜教,非常感謝。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM