Как перенаправить на перегрузку после IActionResult

#c# #asp.net-core #.net-6.0

#c# #asp.net-core #.net-6.0

Вопрос:

Я работаю над Apsp.Net 6 целевым проектом .Net6 .

У меня есть этот ActionResult:

     [Route( nameof(Recreate))]
    public async Task<IActionResult> Recreate()
    {
       //Some code here
    }

    [HttpPost]
    [Route( nameof(Recreate))]
    public async Task<IActionResult> Recreate(StudentYearlyResultReCreateVm model)
    {
       //Some code here
    }
 

Теперь у меня есть другое ActionResult описание, подобное этому :

     [Route( nameof(RecreateWithId))]
    public async Task<IActionResult> RecreateWithId(int id)
    {
        var result = await _studentYearlyResultRepository.GetByIdAsync( id );
        var modelObj = new StudentYearlyResultReCreateVm() {StudentId = result.StudentId , AcademicYearId = result.AcademicYearId};

        return RedirectToAction( nameof( Recreate ) , modelObj );
    }
 

Проблема:
Проблема в RecreateWithId методе, который я пытаюсь RedirectToAction использовать для перегрузки после Recreate действия, но все, что я получил, просто перенаправляется на Get.

Итак, пожалуйста, как я могу перенаправить на перегрузку после Recreate ? Заранее благодарю.

Комментарии:

1. Вы не можете «перенаправить» на конечную точку POST. Вы полностью уверены, что это то, что вы хотите сделать, а не просто выполнить код конечной точки POST?

2. Точно, я хочу выполнить код

3. Итак, вам нужно не перенаправление любого типа. Что вы хотите сделать, так это создать сервис с необходимой бизнес-логикой, внедрить его в контроллер, а затем использовать в обоих действиях

4. хорошо ли создать частный метод в контроллере и повторно использовать его?

Ответ №1:

Быстрое, может быть, грязное (?), Решение.

 [Route( nameof(RecreateWithId))]
public async Task<IActionResult> RecreateWithId(int id)
{
    var result = await _studentYearlyResultRepository.GetByIdAsync( id );
    var modelObj = new StudentYearlyResultReCreateVm() {StudentId = result.StudentId , AcademicYearId = result.AcademicYearId};

    return await Recreate(modelObj );
}
 

Ответ №2:

Когда вы возвращаете действие с помощью RedirectToAction , сервер возвращает браузеру ответ 3xx с Location заголовком на этот URL. Затем браузер переходит к доступу к этому URL с GET помощью verb, изменить это невозможно, если вы не используете Javascript для отправки формы с этого GET URL.

Что касается вашего вопроса, я думаю, что хорошим решением должно быть разделение проблем за счет наличия службы для обработки:

 
[Route("api")]
public class ApiController
{

    ApiService service;
    public ApiController(ApiService service)
    {
        this.service = service;
    }

    [HttpGet, Route("")]
    public async Task OnGetAsync()
    {
        await this.service.DoSomethingAsync();
    }

    [HttpPost, Route("")]
    public async Task<IActionResult> OnPostAsync()
    {
        await this.service.DoSomethingElseAsync();

        // If you call this, don't redirect or it may call DoSomethingAsync twice
        await this.service.DoSomethingAsync();
        
        return this.RedirectToAction(nameof("OnGetAsync"));
    }

}