Asp.net mvc 如何在asp mvc 4中实现PRG模式并仍然使用Ajax post响应?

Asp.net mvc 如何在asp mvc 4中实现PRG模式并仍然使用Ajax post响应?,asp.net-mvc,asp.net-mvc-4,http-post,Asp.net Mvc,Asp.net Mvc 4,Http Post,我们的MVC控制器继承自移除响应的自定义控制器(对于PRG模式): 在客户端,我正在对数据库进行简单的保存: var success = function (result) { showNotification(result.Message, 'success', 3000); hrp.load(); } var inputArray = $(hoursForm + ' [name], ' +

我们的MVC控制器继承自移除响应的自定义控制器(对于PRG模式):

在客户端,我正在对数据库进行简单的保存:

        var success = function (result) {
             showNotification(result.Message, 'success', 3000);
             hrp.load();
        }


        var inputArray = $(hoursForm + ' [name], ' + hoursFormId);
        postAjaxArrayData('RoundingPolicies/SaveHoursRoundingPolicy', inputArray, success);
这使得控制器很好,进行保存,但由于我们正在清除响应,success()不会从以下位置返回结果:

public void SaveHoursRoundingPolicy(HoursRoundingPolicyViewModel hoursRoundingPolicyViewModel) {

   // Save

    var json = new {
        hoursRoundingPolicyViewModel.RoundingPolicyId,
        hoursRoundingPolicyViewModel.Name,
        Message = String.Format("Successfully Saved - ({0}) {1}", hoursRoundingPolicyViewModel.RoundingPolicyId, hoursRoundingPolicyViewModel.Name)
    };
    return Json(json);
}
我们如何仍然实现PRG模式(通过清除帖子上的响应),但仍然从Ajax帖子中获得结果?我可以在OnResultExecuted()中区分这两个吗


我想这对于任何使用PRG模式和MVC的人来说都是一个相当常见的场景,有什么想法吗?

为什么要清除响应?这不是PRG的一部分。。。至少在我的经验中不是这样

根据我使用PRG的经验,您接受帖子,当/如果成功,您只需重定向到另一个操作,这会导致GET,无需清除响应

遵循上述模式仍将允许AJAX帖子像普通帖子一样工作

// Simple implementation of PRG    
[AcceptVerbs(HttpVerbs.Post)
public ActionResult Something(int value) {
   return RedirectToAction("SomethingElse");
}

public ActionResult SomethingElse() {
   return View();
}

// Simple implementation of standard post
[AcceptVerbs(HttpVerbs.Post)
public ActionResult SomethingAjax(int value) {
   return Json(value);
}
为filterContext编辑。结果比较 这应该检查操作的返回类型,而不是将Response.Clear()应用于JsonResult响应

protected override void OnResultExecuted(ResultExecutedContext filterContext)
{
    if (filterContext.HttpContext.Request.HttpMethod != @"GET" && !(filterContext.Result is JsonResult))
    {
        Response.Clear();
    }
}

// Simple implementation of standard post
[AcceptVerbs(HttpVerbs.Post)
public JsonResult SomethingAjax(int value) {
   return Json(value);
}

谢谢Anthony,只要我们在ActionResults上重定向,我们就可以为任何JSON类型的请求/响应返回响应了?我们是否可以避免重复提交、刷新等?我也有同样的想法,但我想听听其他人的想法……是的,因为一旦重定向发生,它就会请求从重定向操作中获取。我想,作为另一种选择,您可以执行JsonResult返回类型,并可能在OnResultExecuted中处理它(没有任何代码示例,但如果您愿意,可以处理一些事情),但您不能执行清除(如果您死心塌地地使用Response.clear)实际上添加了检查动作结果类型的代码,这比我想象的要简单
protected override void OnResultExecuted(ResultExecutedContext filterContext)
{
    if (filterContext.HttpContext.Request.HttpMethod != @"GET" && !(filterContext.Result is JsonResult))
    {
        Response.Clear();
    }
}

// Simple implementation of standard post
[AcceptVerbs(HttpVerbs.Post)
public JsonResult SomethingAjax(int value) {
   return Json(value);
}