重构方法必须是 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();
}
我正在尝试重构我的控制器代码。我想提取在我的控制器的任何方法中使用的一段代码,但是这段代码可以 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();
}