首页 > 解决方案 > 抛出异常以回滚并同时重定向到另一个动作

问题描述

当发生异常时,我试图将一个动作重定向到另一个动作。另外,我想同时回滚所有更改。回滚数据是通过抛出异常来完成的,但是当我们抛出异常时,重定向不起作用。(我使用了一个框架(ABP)在抛出异常时自动处理回滚,所以我的代码中没有“BeginTransaction”和“Commit”等。)

当代码运行时,它只是回滚对数据的更改并显示异常但不重定向。

[HttpPost]
public async Task<ActionResult> action1()
{
    var exception=false;

    try
    {
        await method1();

        return RedirectToAction("Success", "Result");
    }
    catch (Exception e)
    {
        exception = true;
        return RedirectToAction("ShowError", "Result");
    }
    finally
    {
        if (exception == true)
            throw new Exception("1000"); 
    }
}

public async Task<ActionResult> method1()
{
    // Some changes on database
}

标签: c#rollbackaspnetboilerplateunit-of-worktransactionscope

解决方案


此外,我想同时回滚所有更改。回滚数据需要抛出异常,当我们抛出异常时,重定向不起作用。

您不能让方法返回结果引发异常;它是一个或另一个。

你可以做的是抛出一个异常——这会导致回滚——然后在你的操作方法中捕获它并返回一个结果:

[HttpPost]
public async Task<ActionResult> action1()
{
  try
  {
    await method1();
    return RedirectToAction("Success", "Result");
  }
  catch (Exception e)
  {
    return RedirectToAction("ShowError", "Result");
  }
}

推荐阅读