Asp.net mvc 如何在asp mvc 4中实现PRG模式并仍然使用Ajax post响应?
我们的MVC控制器继承自移除响应的自定义控制器(对于PRG模式): 在客户端,我正在对数据库进行简单的保存: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], ' +
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);
}