2011-03-01 13 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 

削除動詞の使用はFFでは機能しますが、IEでは機能しません。 DELETE動詞をPOSTに置き換えることは、まったく動作しないように思えます。これをIEで動作させるにはどうすればよいですか?

+0

FYI: 'RedirectToAction'はXHRで期待通りに動作しません... –

+0

IEではどうなりますか?間違いはありますか?リクエストが発生しますか?どのような種類ですか? –

+0

エラーはSystem.Web.HttpExceptionでした:パブリックアクションメソッド 'Delete'がコントローラ 'SHP.Controllers.EmployeeController'に見つかりませんでした。 – arame3333

答えて

1

2つのこと:

  1. あなたのアクションメソッドのみが実行されるため、動作しませんPOSTDELETEを変更... XHR、becauseで(リダイレクト)
  2. をHTTP 302を使用しないでください。あなたがPOSTトンを受け入れるためにそれを変更したい場合は

    [AcceptVerbs(HttpVerbs.Delete)] 
    

    :あなたはDELETEを行うとき鶏それはを働かせます。

  3. MVC2 +を使用している場合は、HTTPメソッドオーバーライドを使用することもできます。
+0

DELETE動詞をPOSTに変更すると、メソッドを呼び出してレコードを削除することができますが、RedirectToActionコマンドは機能していないようです。それはFFではあるがIEではしない。私はSystem.Web.HttpExceptionを取得します:パブリックアクションメソッド 'EmployeeAbsence'がコントローラ 'SHP.Controllers.EmployeeController'に見つかりませんでした。 – 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のみ にHTTPの削除操作を実行しているデータベースのレコードを削除GETとPOST

ので、適切なものは行うに サポートします。 HTTP DELETEを実行すると セキュリティホールが開かれず、 はREST原則に違反しません。

残念ながら、標準HTMLでは、 とPOST以外のHTTP操作はサポートされていません。 リンクは常にGET を実行し、フォームはGETまたは POSTを実行できます。 HTMLは他の タイプのHTTP操作をサポートしていません。

HTML 3.1 仕様によると、HTMLフォームタグのみ はGETとPOSTをサポートしています。 DELETEまたはPUTなどの他のHTTP操作をサポートしていません。 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を取得します:パブリックアクションメソッド 'EmployeeAbsence'がコントローラ 'SHP.Controllers.EmployeeController'に見つかりませんでした。 – arame3333

関連する問題