#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"));
}
}