2011-10-24 27 views
0

任何人都可以看到为什么此代码无效吗? 我知道有人会注意到我正在使用删除链接,我应该使用DELETE动词而不是POST,但即使在SO的帮助下,我也无法解决该问题。 这里没有问题,我点击删除,底层数据被删除确定,但在我删除数据后,当我尝试重定向到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

你似乎调用使用AJAX的DeleteRow javascript函数(你没有显示)内的删除操作。您不能在AJAX请求中重定向。这就是他们的要点:不要刷新整个浏览器,而只是刷新整个浏览器的一部分。

如果你想执行您的AJAX的成功回调里面全转接呼叫您可以使用window.location.href属性,像这样:

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

当然现在做这样的事情是没有意义的。我会简单地用一个标准的HTML形式将张贴顶部的删除操作,而不是用在所有的任何JavaScript:当表单提交的删除操作将被调用,将执行实际的删除和重定向

​​

现在浏览器到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

现货。这个DELETE动词也适用,所以更好。 – arame3333