【问题标题】:Prevent RedirectToAction() if AJAX request如果 AJAX 请求阻止 RedirectToAction()
【发布时间】:2011-12-30 16:08:01
【问题描述】:

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

    // 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 或 @ 987654328@.

如果您认为我的工作流程有误,请随时回复。

【问题讨论】:

  • 如果TryUpdateModel 返回false 并且它是一个ajax 请求会发生什么?
  • 我明白你的意思。这段代码 sn-p 确实缺少这一点。这是尝试通过一项操作涵盖多个用例时的问题之一。

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


【解决方案1】:

您应该通过实现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 请求并且结果类型是一个重定向,这应该覆盖结果......至少,这应该给你一个正确的方向。不过,我并不完全相信这是一种很棒的架构方法......

【讨论】:

  • 这看起来很适合我的架构方法,但你是怎么做到的?
猜你喜欢
  • 2019-11-04
  • 1970-01-01
  • 2015-06-08
  • 2019-04-17
  • 2016-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多