2011-03-01 47 views
0

在我的MVC應用程序我有一個使用HTML輔助函數的網格。 EditorTemplate看起來像;MVC:使用DELETE動詞在FF工作,但不是在IE

<tr> 
    <td> 
     <%-- Ajax Delete --%> 
     <% if(Model.LeaveId > 0) { %> 
     <%: Html.DeleteEmployeeOtherLeave("Delete", Model)%> 
     <%} %> 
    </td> 
    <td><%: Model.LeaveType %></td> 
    <td><%: Model.MorningOnlyFlag %></td> 
    <td><%: Model.AfternoonOnlyFlag %></td> 
    <td><%: Model.DayAmount %></td> 
    <td><%: String.Format("{0:ddd MMM d yyyy}", Model.Date)%></td> 
</tr> 

而HTML助手看起來像;

 public static MvcHtmlString DeleteEmployeeOtherLeave(this HtmlHelper html, string linkText, Leave _leave) 
     { 
      return html.RouteLink(linkText, "Default", 
       new { _employeeOtherLeaveId = _leave.LeaveId, action = "Delete" }, 
       new { onclick = "$.ajax({url: this.href, type: 'DELETE', success: function(result) {$('#wholepage').html(result);}}); return false;" } 
     } 

我的控制器看起來像;

[HttpGet]   
    [Authorize(Roles = "Administrator, AdminAccounts, ManagerAccounts")] 
    public ActionResult EmployeeAbsence() 
    { 
     if ((SessionObjects.AbsenceStartDate > DateTime.MinValue) && (SessionObjects.AbsenceEndDate > DateTime.MinValue)) 
      if (SessionObjects.AbsenceSelectedEmployeeId == 0) 
       return View(new AbsenceViewModel() 
       { 
        AbsenceStartDate = SessionObjects.AbsenceStartDate, 
        AbsenceEndDate = SessionObjects.AbsenceEndDate 
       }); 
      else 
       return View(new AbsenceViewModel(
        SessionObjects.AbsenceStartDate, 
        SessionObjects.AbsenceEndDate, 
        SessionObjects.AbsenceSelectedEmployeeId 
        )); 

     return View(); 
    } 

    [AcceptVerbs(HttpVerbs.Delete)] 
    public ActionResult Delete(int _employeeOtherLeaveId) 
    { 
     EmployeeOtherLeaf.Delete(_employeeOtherLeaveId); 
     return RedirectToAction("EmployeeAbsence"); 
    } 
    #endregion 

使用Delete動作在FF中工作,但在IE中不起作用。用POST代替DELETE動詞似乎阻止它工作。我如何得到這個在IE中工作?

+0

僅供參考:RedirectToAction將不能用於XHR,因爲您期望它... –

+0

IE中究竟發生了什麼?你有錯誤嗎?請求是否發生?哪一種? –

+0

錯誤是System.Web.HttpException:在控制器'SHP.Controllers.EmployeeController'上找不到公共操作方法'Delete'。 – arame3333

回答

1

兩件事情:

  1. 不要使用HTTP 302(重定向)與XHR,because ...
  2. 更改DELETEPOST將無法​​正常工作,因爲你的操作方法只執行當你做一個DELETE

    [AcceptVerbs(HttpVerbs.Delete)] 
    

    如果你想改變它,接受POST噸母雞它會工作

  3. 如果您使用的是MVC2 +,您也可以使用HTTP方法覆蓋。
+0

當我將DELETE動詞更改爲POST時,發現我調用方法並刪除了記錄,但是RedirectToAction命令似乎不起作用。它在FF中但不在IE中。我得到System.Web.HttpException:在控制器'SHP.Controllers.EmployeeController'上未找到公共操作方法'EmployeeAbsence'。 – arame3333

+0

@ arame3333:您是否嘗試刪除(用於測試目的)'EmployeeAbsence'操作上的'Authorize'屬性? –

1

檢查了這一點。

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

HTML只支持GET和POST

所以,正確的事情時 刪除數據庫記錄到 執行HTTP DELETE操作。 執行HTTP DELETE不 打開一個安全漏洞,它並沒有違反 REST原則。

不幸的是,除了GET 和POST以外,標準HTML不支持 的HTTP操作。鏈路總是執行GET 和形式可以執行任一GET或POST 。 HTML不支持其他的 類型的HTTP操作。

根據HTML 3.1 規範,只有HTML FORM標籤 支持GET和POST。它不支持 其他HTTP操作,如刪除 或PUT。見 http://www.w3.org/TR/REC-html32.html#form。 此外,Internet Explorer只有 支持GET和POST(請參閱 http://msdn.microsoft.com/en-us/library/ms534167(VS.85).aspx)。

+0

當我將DELETE動詞更改爲POST時,我發現我調用了方法並刪除了記錄,但是RedirectToAction命令似乎不起作用。它在FF中但不在IE中。我得到System.Web.HttpException:在控制器'SHP.Controllers.EmployeeController'上未找到公共操作方法'EmployeeAbsence'。 – arame3333

相關問題