4.5 資料維護 - 修改與刪除

ASP.NET MVC 實務精要|第四章 串接關聯式資料庫 - SQL Server

當使用者點擊商品查詢清單畫面的連結,會導向至資料編輯頁:



以第二筆資料為例,點擊編輯按鈕,根據編輯連結的設計:

@Html.ActionLink("編輯",
"Update/" + product.ID,
"Home", null, new { @class = "editButton" })

此時網頁送出Home/Update/2連結字串,因此HomeController.cs 類別檔中的Update方法被執行,並且傳入id參數等於2,也就是所要編輯的商品編號。為了支援這個連結要求,於HomeController.cs建立以下的Update方法:

public ActionResult Update(int id=0)
{
KTStore db = new KTStore();
    Product product = db.Product.Find(id);
    return View(product);           
}

其中透過Find()方法取得資料庫中Products資料表裏面,符合id參數的商品資料封裝成Product物件,並且將其回傳。緊接著建立對應此動作方法的檢視檔案Update.cshtml,內容如下:

@model DBModelDemo.Models.Product
@{
    ViewBag.Title = "Update";
}
@ViewBag.pid
@using (Html.BeginForm())
{
    @Html.HiddenFor(model => model.ID)
    <div class="editor-field">
        名稱:@Html.EditorFor(model => model.Name)
    </div>
    <div class="editor-field">
        價格:@Html.EditorFor(model => model.Price)
    </div>
    <div class="editor-field">
        說明:@Html.EditorFor(model => model.Description)
    </div>
    <p>
        <input type="submit" value="更新" />
    </p>
}

第一行宣告所要處理的物件型別,對應Update動作方法傳送過來的Product物件,並且利用Html.BeginForm() 配置資料編輯介面所需的表單,然後透過 Html.EditorFor() 配置文字方塊以支援使用者的編輯作業,由於ID欄位不允許修改,因此以隱藏欄位Html.HiddenFor進行配置。這個檢視的表單於使用者按下「儲存」按鈕時,封裝表單中各欄位內容取得更新後的Product物件,將此參數再次傳入HomeController.cs類別檔中的Update方法,為了回應這個要求,我們必須建立另外一個版本的Update()方法。

[HttpPost]
public ActionResult Update(Product product)
{
    KTStore db = new KTStore();   
    db.Entry(product).State = EntityState.Modified;
    db.Entry(product).Property("CreatedOn").IsModified = false;
    db.SaveChanges();
    return RedirectToAction("ProductList", new {name=product.Name});
}

參數 product 為使用者於網頁上修改完成的資料封裝物件,將其狀態設定為 EntityState.Modified ,表示回傳的資料已經修改。由於CreatedOn是第一次建立資料時間,因此接下來還要將其中的CreatedOn屬性的IsModified設為false,如此一來這個欄位的資料就不會作異動。

最後引用SaveChanges()儲存即可完成資料更新,模型透過 Entity Framework 間接與底層資料庫進行溝通,當資料發生異動時,這些異動只會在 Entity Framework 的資料集合中發生,直到調用 SaveChange() 確認,才由系統自行將發生的異動,更新至底層資料庫。

最後一行透過 RedirectToAction() 將其轉向至指定的動作方法,第一個參數表示將流程轉向至ProductList,並且傳入商品名稱當作參數,如此一來網頁就可以回到商品清單檢視頁,並且呈現此筆修改資料的更新內容。
參數 product 為使用者於網頁上修改完成的資料封裝物件,將其狀態設定為

資料刪除

刪除資料的動作是從資料集合中將某筆資料設定為刪除狀態,再將此更新儲存至底層資料庫,與上述的編輯類似,在Search.cshtml中的刪除功能連結如下:

@Html.ActionLink("刪除", "Delete/" + product.ID)

這組超連結對應的是Delete動作方法,並且連同所要刪除的商品識別編號一併回傳。以下是Delete方法的內容:

public ActionResult Delete(int id = 0)
{
    Item item = GetItemById(id);
    if (item == null)
    {
        return HttpNotFound();
    }
    return View(item);
}

其中搜尋此編號的資料,然後將其回傳以方便使用者檢視所要刪除的資料內容以進行確認,最後回傳檢視Delete.cshtml,提供刪除功能按鈕,讓使用者將隱藏欄位中的商品項目編號回傳資料庫以進行刪除作業,刪除功能需要的 POST 版本的delete動作方法,程式內容如下:

@model KTBookStore.Models.Item
@{
    ViewBag.Title = "Edit";
}
<h2>編輯品項資料</h2>

@using (Html.BeginForm())
{
    @Html.HiddenFor(item => item.ItemId)

    <p><label>品項</label>@Html.DisplayFor(item => item.Name)</p>
    <p><label>說明</label>@Html.DisplayFor(item => item.Description)</p>
    <p><label>價格</label>@Html.DisplayFor(item => item.Price)</p>
    <p>
        <input type="submit" value="刪除" />
@Html.ActionLink("品項搜尋", "ItemList")
    </p>
    <p><label> @if (ViewBag.editMessage != null)
    { @ViewBag.EditMessage }</label></p>
}

由於刪除動作是將資料從資料庫整筆移除,因此只須顯示其中的內容即可,最後提供刪除按鈕,讓使用者將隱藏欄位中的商品項目編號回傳資料庫以進行刪除作業,刪除功能需要的 POST 版本的delete動作方法,程式內容如下:

[HttpPost, ActionName("Delete")]
public ActionResult DeleteConfirmed(int id)
{
    KTBookStoreContext db = new KTBookStoreContext();
    Item item = db.Items.Find(id);
    db.Items.Remove(item);
    db.SaveChanges();
    return RedirectToAction("ItemList");
}

這是刪除確認動作方法,一開始的ActionName 屬性設定為 Delete ,接下來透過id 將資料取出,並且引用 Remove() 方法將其移除,最後的 SaveChanges() 將刪除結果反應至底層資料庫完成刪除動作。


沒有留言: