抛出异常,以回滚并同时重定向到另一个动作。

问题描述 投票:0回答:1

我正试图在发生异常时将一个操作重定向到另一个操作。此外,我想同时回滚所有的变化。回滚数据是通过抛出一个异常来完成的,但是当我们抛出一个异常时,重定向是不工作的。(我使用的是一个框架(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# rollback actionresult asp.net-boilerplate
1个回答
1
投票

ABP的 常规工作单位 是围绕着您的控制器动作 action1.

你应该要求一个新的工作单位,在你的范围内。try 块。

[HttpPost]
public async Task<ActionResult> action1()
{
    try
    {
        using (var uow = _unitOfWorkManager.Begin(TransactionScopeOption.RequiresNew))
        {
            await method1();
            uow.Complete();
        }

        return RedirectToAction("Success", "Result");
    }
    catch (Exception e)
    {
        return RedirectToAction("ShowError", "Result");
    }
}

或者,你可以做 method1 virtual 并标明 UnitOfWork 属性。

[HttpPost]
public async Task<ActionResult> action1()
{
    try
    {
        await method1();

        return RedirectToAction("Success", "Result");
    }
    catch (Exception e)
    {
        return RedirectToAction("ShowError", "Result");
    }
}

[UnitOfWork(TransactionScopeOption.RequiresNew)]
public virtual async Task<ActionResult> method1()
{
    // Some changes on database
}

参考。如何在捕捉块中返回-1 (aspnetboilerplateaspnetboilerplate#2732)


1
投票

另外,我想在同一时间回滚所有的变化。回滚数据需要抛出异常,而当我们抛出异常时,重定向就无法工作。

你不能让一个方法返回一个结果。 抛出一个异常;要么是一个,要么是另一个。

你可以做的是抛出一个异常--这将导致回滚--然后在你的动作方法中捕获它并返回一个结果。

[HttpPost]
public async Task<ActionResult> action1()
{
  try
  {
    await method1();
    return RedirectToAction("Success", "Result");
  }
  catch (Exception e)
  {
    return RedirectToAction("ShowError", "Result");
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.