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

时间:2014-06-11 21:25:23

标签: asp.net-mvc asp.net-mvc-4 http-post

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

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

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

        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模式(通过清除POST上的响应)但仍然从Ajax POST获得结果?我可以在OnResultExecuted()中区分两者吗?

我认为这对于使用PRC模式和MVC的人来说是一个相当常见的场景,有关如何做到这一点的想法吗?

1 个答案:

答案 0 :(得分:2)

为什么要清除回复?这不是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);
}

EDITED for filterContext.Result Comparison 这应该检查Action的返回类型,并且当它是JsonResult

时不将Response.Clear()应用于Response。
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);
}