如果AJAX请求,则阻止RedirectToAction()

时间:2011-12-30 16:08:01

标签: asp.net ajax asp.net-mvc-3

以我的控制器中的编辑操作为例:

    // 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请求,则让动作过滤器对其进行操作,这意味着停止重定向并返回ContentResultJsonResult

如果您认为我的工作流程错误,也可以随时回复。

1 个答案:

答案 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请求和结果类型是重定向,这应该覆盖结果...至少,这应该会推动你正确的方向。我并不是非常相信这是一个伟大的建筑方法,但是......