MVC:使用DELETE动词在FF中工作但在IE中不起作用

时间:2011-03-01 12:05:19

标签: jquery asp.net-mvc ajax

在我的MVC应用程序中,我有一个使用HTML帮助函数的网格。 EditorTemplate看起来像;

<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

使用删除动词在FF中有效,但在IE中无效。用POST替换DELETE动词似乎阻止了它的运行。如何在IE中使用它?

3 个答案:

答案 0 :(得分: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原则。

     

不幸的是,标准HTML没有   支持GET以外的HTTP操作   和POST。链接始终执行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)。

答案 1 :(得分:1)

两件事:

  1. 不要将HTTP 302(重定向)与XHR,because ...
  2. 一起使用
  3. DELETE更改为POST将无效,因为您的操作方法仅在执行DELETE时执行:

    [AcceptVerbs(HttpVerbs.Delete)]
    

    如果您将其更改为接受POST,那么就可以

  4. 如果你正在使用MVC2 +,你也可以使用HTTP方法覆盖。

答案 2 :(得分:0)

IE可能不支持DELETE次请求。见Problem with jQuery.ajax with 'delete' method in ie