Сильно типизированный RedirectToAction (Futures) с использованием асинхронных контроллеров

Имея этот код, он дает мне предупреждение: Because this call is not awaited, execution of the current method continues before the call is completed. Consider applying the 'await' operator to the result of the call.

    public async Task<ActionResult> Details(Guid id)
    {
        var calendarEvent = await service.FindByIdAsync(id);
        if (calendarEvent == null) return RedirectToAction<CalendarController>(c => c.Index());
        var model = new CalendarEventPresentation(calendarEvent);
        ViewData.Model = model;
        return View();
    }

    public async Task<RedirectResult> Create(CalendarEventBindingModel binding)
    {
        var model = service.Create(binding);
        await context.SaveChangesAsync();
        return this.RedirectToAction<CalendarController>(c => c.Details(model.CalendarEventID));
    }

если я добавлю await оператор я получаю:

Error CS4034 The 'await' operator can only be used within an async lambda expression. Consider marking this lambda expression with the 'async' modifier.

если я добавлю async модификатор как это:

return this.RedirectToAction<CalendarController>(async c => await c.Details(model.CalendarEventID));

ошибка Error CS1989 Async lambda expressions cannot be converted to expression trees

Итак, как я могу использовать строго типизированный RedirectToAction (я использую MVC Futures) с асинхронными контроллерами?

1 ответ

Я понял это!

У меня есть базовый контроллер и там у меня есть метод расширения для асинхронных перенаправлений

protected ActionResult RedirectToAsyncAction<TController>(Expression<Func<TController, Task<ActionResult>>> action)
        where TController : Controller
    {
        Expression<Action<TController>> convertedFuncToAction = Expression.Lambda<Action<TController>>(action.Body, action.Parameters.First());
        return ControllerExtensions.RedirectToAction(this, convertedFuncToAction);
    }

это предотвратит предупреждения. Затем вы можете просто вызвать RedirectToAsyncAction из вашего контроллера.

public ActionResult MyAction()
    {
       // Your code
        return RedirectToAsyncAction<MyController>(c => c.MyAsyncAction(params,..)); // no warnings here
    }
Другие вопросы по тегам