以我的控制器中的编辑操作为例:
// POST: /Admin/Text/Edit/5
[HttpPost]
[ValidateInput(false)]
public virtual ActionResult Edit(TextViewModel editing)
{
if (!ModelState.IsValid)
return View(editing);
Text existing = _repository.Find(editing.Id);
if (TryUpdateModel(existing)) {
_repository.Update(existing);
if(Request.IsAjaxRequest())
return Content(bool.TrueString);
else
return RedirectToAction(pndng.Admin.Text.List());
}
else return View(editing);
}
我希望此操作可以处理经典(非AJAX form
)和AJAX(jquery)POST。在AJAX POST的情况下,请求很可能来自内联编辑表单。在这种情况下,操作应该只返回Content=Ok
结果。如果我们一直在表单页面中编辑模型并执行经典postback
,我们希望将用户重定向回内容列表(请参阅RedirectToAction()
)。
然而,困扰我的是if..else
条款。我想把它抽象成一个动作过滤器/属性。我想留下重定向调用(因为这是默认设置)但如果它检测到请求实际上是AJAX请求,则让动作过滤器对其进行操作,这意味着停止重定向并返回ContentResult
或JsonResult
。
如果您认为我的工作流程错误,也可以随时回复。
答案 0 :(得分:2)
您应该通过实施IResultFilter来实现自定义ResultFilter以执行您想要的操作。类似的东西:
public class AjaxOverrideFilter : IResultFilter
{
public void OnResultExecuting(ResultExecutingContext filterContext)
{
}
public void OnResultExecuted(ResultExecutedContext filterContext)
{
if (filterContext.HttpContext.Request.IsAjaxRequest() && filterContext.Result is RedirectResult)
filterContext.Result = new ContentResult {Content = "Ok"};
}
}
然后用[AjaxOverrideFilter]
装饰该动作。
如果它的ajax请求和结果类型是重定向,这应该覆盖结果...至少,这应该会推动你正确的方向。我并不是非常相信这是一个伟大的建筑方法,但是......