demoshop

demo, trying to be the best_

以往我們在使用 ASP.NE 的時候作刪除實在是爆簡單的,隨處可刪,隨手可刪,但是如果你有接觸過ASP.NET MVC 看完了官方教學文章後你會有一個很直接的問題 為什麼新增、編輯、更新都有教學就是獨漏〔刪除〕 難道ASP.NET MVC不能刪除嗎?

在我們實做刪除之前,我們要先來了解HTTP的基礎,不過也不需要太深刻,只需要大致了解 Get 和 Post 這兩個 HttpMethod 就可以了,因為 ASP.NET 內建是使用 POST 傳遞資訊,因此他可以很大方的設計好〔刪除〕的功能,但是來到ASP.NET MVC就不太一樣了,沒有明確指定一律都是 Get 傳遞,所以會造成資安問題, Get 和 Post 最直接的差異就是使用者會不會在網址上看到傳遞的資訊,用一個最簡單的例子來解釋比如說 Google 的搜尋結果頁就是一個 利用Get 的時例,所以各位想想所有傳遞的資訊都在網址上可以看到,那如果我們用 Get 來作刪除的動作,可想而知了等於門戶大開,因此刪除一定至少要使用POST來作!!
(標準其實是用Delete)。

  那就回來說一下為什麼 ASP.NET 可以幫我們實做好刪除,因為 ASP.NET 所有的內容就是包在一個 Form裡面,但 ASP.NET MVC 可不一樣,那如果說只是為了一個〔刪除〕我就要把他包進 Form 來指定使用 Post 會不會太麻煩也太怪了?,好在 jQuery可以很方便的幫我們處理。


使用jQuery來實做刪除的方式


<input name="delete" type="button" value="刪除" onclick="Delete('<%= Model.ID %>')" /> 
<script type="text/javascript">
   function Delete(id) {
       if (confirm('你確定要刪除嗎 ?')) {
           $.post('<%= Url.Action("Delete") %>', { id: id },
                    function(data, textStatus) {
                        if (data == "1") {
                            alert('刪除成功!');
                            location.reload(true);
                        }
                        else {
                            alert('Error');
                        }
                    }, "text");
       }
   }
</script> 

這樣是很直覺的寫法,但是各位的看的出來,首先我們要對於jQuery有一定的認識,對於CallBack也要了解,對於剛接觸 ASP.NET MVC  這什麼都要自己來的初學者會有一定程度的阻礙。


好加在〔懶是程式設計師的美德〕ASP.NET MVC 有內建 AJAX這應該是大家都了解的了,因此我們利用內建的AJAX Helper 來幫我們完成上面麻煩的寫法。

<%=Ajax.ActionLink("刪除", "Del", "controllerName", new AjaxOptions() { HttpMethod = "Delete", Confirm = "確定要刪除嗎?", UpdateTargetId = "main" })%> 

看到沒!!簡單、直覺、標準的AJAX Form ,不拖泥帶水。不過這裡 demo  是用 Delete 這個 HttpMethod 所以後面記得要用

[AcceptVerbs(HttpVerbs.Delete)] 

來接。


  • Delete 雖然是標準但是會被一些資安軟體擋住(它們太嫩只看的懂 Get 和 Post )因此建議實務上除非明確的知道不然還是使用 Post 就可以了。
  • 想要使用 ASP.NET MVC 的內建 AJAX 功能必須要記得載入下面兩個js(順序要對)
    • MicrosoftAjax.js
    • MicrosoftMvcAjax.js

 

http://www.stephenwalther.com/blog/archive/2009/01/21/asp.net-mvc-tip-46-ndash-donrsquot-use-delete-links-because.aspx

回應討論