重构方法必须是 RedirectToAction 或什么也不做。我怎样才能做到这一点?

The refactoring method must either RedirectToAction or do nothing. How can I achieve that?

我正在尝试重构我的控制器代码。我想提取在我的控制器的任何方法中使用的一段代码,但是这段代码可以 return 一个 RedirectToAction 或者什么都不做。我不知道如何编写重构方法才能拥有两种不同的 return 类型。

我的解释似乎有点混乱,但代码真的很简单:

这是我要重构的代码

 public async Task<IActionResult> Texts()
 {
    var model = new FeaturesViewModel();
    try
    {
        // The code I want to extract
        var currentPage = await _customersRepository.GetCustomersPageAsync(currentRoute);
        if (currentPage == null)
        {
           return RedirectToAction("Error", "Home", new { statusCode = 404 });
        }
        this.RouteData.SetPage(currentPage);

        // any code
    }
    catch (Exception ex)
    {
        // any code
    }
    return View(model);
}

这是新代码:

 public async Task<IActionResult> Texts()
 {
    var model = new FeaturesViewModel();
    try
    {
        // extracted code 
        await GetCurrentPageAsync(this.RouteData.GetRoute());

        // any code
    }
    catch (Exception ex)
    {
        // any code
    }
    return View(model);
}

// the new method which will be using in every action
private async Task<IActionResult> GetCurrentPageAsync(string currentRoute)
{
   var currentPage = await _customersRepository.GetCustomersPageAsync(currentRoute);
   if (currentPage == null)
   {
       return RedirectToAction("Error", "Home", new { statusCode = 404 });
   }
   this.RouteData.SetPage(currentPage);

   // the problem is : when I get to this line, it doesn't return to the calling method...
}

我没有尝试太多,因为我想知道这是可以实现的还是这是一个设计死胡同?

我试过将操作的名称作为参数传递并执行“return RedirectToAction(action_parameter)”。但是,当然,这是行不通的,因为我 return 回到了行动的开始,而不是我离开的地方。

我已经通过这种方式解决了这个问题:

private async Task<IActionResult> GetCurrentPageAsync(string currentRoute)
{
    var currentPage = await _customersRepository.GetCustomersPageAsync(currentRoute);
    if (currentPage == null)
     {
         return RedirectToAction("Error", "Home", new { statusCode = 404 });
     }
    this.RouteData.SetPage(currentPage);


    return Ok();
}