2011-10-24 4 views
0

このコードが機能しない理由を誰に見てもらえますか? 私は誰かが私がDeleteリンクを使用していることに気付くでしょう、私はPOSTではなくDELETE動詞を使用するべきですが、私はその助けを借りても、その問題を解決できませんでした。 ここで問題は私が削除をクリックし、元のデータが削除されたOKですが、データを削除した後、Payroll GETメソッドにリダイレクトしようとすると、呼び出されず、結果として画面に表示されません。リフレッシュされます。 コントローラ上のコードはここにあります。グリッド内の行を削除した後にページを更新できない

[HttpGet] 
[Authorize(Roles = "Administrator, AdminAccounts, ManagerAccounts")] 
public ActionResult Payroll() 
{ 
    if ((SessionObjects.PeriodStartDate > DateTime.MinValue) && (SessionObjects.PeriodEndDate > DateTime.MinValue)) 
     if (SessionObjects.PayrollSelectedEmployeeId == 0) 
      return View(new PayrollViewModel() 
       { 
        PeriodStartDate = SessionObjects.PeriodStartDate, 
        PeriodEndDate = SessionObjects.PeriodEndDate 
       }); 
     else 
      return View(new PayrollViewModel(
       SessionObjects.PeriodStartDate, 
       SessionObjects.PeriodEndDate, 
       SessionObjects.PayrollSelectedEmployeeId 
       )); 

    return View(); 
} 

[HttpPost] 
[Authorize(Roles = "Administrator, AdminAccounts, ManagerAccounts")] 
public ActionResult Payroll(PayrollViewModel _pvm) 
{ 
    if (ModelState.IsValid) 
    { 
     SessionObjects.PeriodStartDate = _pvm.PeriodStartDate; 
     SessionObjects.PeriodEndDate = _pvm.PeriodEndDate; 
     if (_pvm.SearchTextId > 0) 
      SessionObjects.PayrollSelectedEmployeeId = _pvm.SearchTextId; 
     return RedirectToAction("Payroll"); 
    } 
    return View(_pvm); 
} 

//[AcceptVerbs(HttpVerbs.Delete)] 
[HttpPost] 
[Authorize(Roles = "Administrator, AdminAccounts, ManagerAccounts")] 
public RedirectToRouteResult Delete(int id) 
{ 
    EmployeeOtherLeaf.Delete(id); 
    return RedirectToAction("Payroll"); 
} 

ビューテンプレートとエディタテンプレートの一部です。

<table class="groupBorder"> 
     <tr> 
      <th></th> 
      <th>Leave Type</th> 
      <th>Notes</th> 
      <th>Day Amount</th> 
      <th>Date</th> 
      <th>Approver</th> 
     </tr> 
     <%: Html.EditorFor(x => x.LeaveList)%> 
    </table> 

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<SHP.WebUI.Models.Leave>" %> 
<%@ Import Namespace="SHP.WebUI.HtmlHelpers" %> 
<%@ Import Namespace="SHP.Models" %> 

<%: Html.RowStyle(Model.RowColour) %> 
<tr> 
    <td style="background-color:White;"> 
     <%-- Ajax Delete --%> 
     <% if(Model.LeaveId > 0) { %> 
     <%: Html.DeleteEmployeeOtherLeave()%> 
     <%} %> 
    </td> 
    <td><%: Model.LeaveType %></td> 
    <td><%: Model.Notes %></td> 
    <td><%: Model.DayAmount %></td> 
    <td><%: String.Format("{0:ddd MMM d yyyy}", Model.Date)%></td> 
    <td><%: Model.ApproverName %></td> 
</tr> 
</tbody> <%-- Leave this here, it closes from the above Html.RowStyle!--%> 

HTMLヘルパーメソッド。

public static MvcHtmlString DeleteEmployeeOtherLeave(this HtmlHelper<Leave> html) 
{ 
    var leave = html.ViewData.Model; 
    return html.RouteLink(
     "Delete", 
     "Default", 
     new {id = leave.LeaveId, action = "Delete" }, 
     new { onclick = "return DeleteRow(this);" } 
    ); 
} 

答えて

1

あなたは(あなたが示されていない)DeleteRow javascript関数の内部でAJAXを使用して削除アクションを起動しているようです。 AJAXリクエストでリダイレクトすることはできません。それは全体のポイントです:ブラウザ全体をリフレッシュせず、その一部だけリフレッシュしてください。

あなたのAJAXの成功コールバック内の完全なリダイレクトを使用すると、このように、window.location.hrefプロパティを使用することができます呼び出しを実行したい場合は、次の

success: function(result) { 
    window.location.href = '/somecontroller/Payroll'; 
} 

今すぐもちろん、このような何かをやってすることは無意味です。フォームが削除アクションは、実際には削除し、リダイレクトを実行れる呼び出されます提出されたときに今

​​

:私は単にトップ削除アクションを掲示し、まったくJavaScriptを使用しません標準のHTMLフォームを使用しますPayrollアクションのブラウザ=>かなり標準的なHTTPダイアログです。

そして、あなたはこの道を行くことにした場合、あなたもボーナスを得る:あなたは[HttpDelete]属性を使用してコントローラのアクションを飾ると、クライアント上の技術を使用することもできます。

<% if(Model.LeaveId > 0) { %> 
    <% using (Html.BeginForm("Delete", "Home", new { id = leave.LeaveId })) { %> 
     <%= Html.HttpMethodOverride(HttpVerbs.Delete) %> 
     <button type="submit">Delete</button> 
    <% } %> 
<% } %> 

、その後:

[HttpDelete] 
[Authorize(Roles = "Administrator, AdminAccounts, ManagerAccounts")] 
public RedirectToRouteResult Delete(int id) 
{ 
    EmployeeOtherLeaf.Delete(id); 
    return RedirectToAction("Payroll"); 
} 

ブラウザでフォーム用にサポートされていないので、実際のDELETE HTTP動詞ではありませんが、ASP.NET MVCが理解し、対応するアクションにリクエストを適切に再ディスパッチすることができる隠しフィールドを使ってシミュレートします。

+0

Spot on。 DELETE動詞も今度はうまくいくので、さらに良くなります。 – arame3333

関連する問題