我们的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的人来说是一个相当常见的场景,有关如何做到这一点的想法吗?
答案 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);
}