【问题标题】:Cannot refresh page after deleting a row in a grid删除网格中的行后无法刷新页面
【发布时间】:2011-10-25 00:25:49
【问题描述】:

谁能明白为什么这段代码不起作用? 我知道有人会注意到我正在使用删除链接,并且我应该使用 DELETE 动词而不是 POST,但即使在 SO 的帮助下,我也无法解决该问题。 不,这里的问题是我点击删除,基础数据被删除 OK,但是在我删除数据后,当我尝试重定向到 Payroll GET 方法时,它没有被调用,因此屏幕没有得到神清气爽。 所以这里是Controller上的代码;

[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 Helper 方法;

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);" }
    );
}

【问题讨论】:

    标签: asp.net-mvc


    【解决方案1】:

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

    如果您想在 AJAX 调用的成功回调中执行完全重定向,您可以使用 window.location.href 属性,如下所示:

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

    当然,现在做这样的事情是没有意义的。我会简单地使用一个标准的 HTML 表单,它会在删除操作的顶部发布,并且根本不使用任何 javascript:

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

    现在,当提交表单时,将调用 Delete 操作,该操作将执行实际删除并将浏览器重定向到 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 理解的隐藏字段来模拟它,并且能够正确地将请求重新分配给相应的操作。

    【讨论】:

    • 正确。 DELETE 动词这次也有效,所以效果更好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-09
    • 1970-01-01
    • 2017-05-03
    • 2016-11-17
    • 1970-01-01
    • 2015-08-09
    • 1970-01-01
    相关资源
    最近更新 更多