Strongly Typed RedirectToAction (Futures) using async Controllers

自作多情 提交于 2020-01-12 07:58:08

问题


having this code it gives me a warning : 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));
    }

if I do add the await operator I get :

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

if I add the async modifier like this :

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

the error is Error CS1989 Async lambda expressions cannot be converted to expression trees

So how can I use strongly typed RedirectToAction (I'm using MVC Futures) with async controllers?


回答1:


I have figured this out!

I have a base controller and there I have an extension method for async redirects

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

this will prevent warnings. Then you can just call RedirectToAsyncAction from your Controller.

public ActionResult MyAction()
    {
       // Your code
        return RedirectToAsyncAction<MyController>(c => c.MyAsyncAction(params,..)); // no warnings here
    }


来源:https://stackoverflow.com/questions/28321638/strongly-typed-redirecttoaction-futures-using-async-controllers

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!