使用异步控制器的强类型RedirectToAction(Futures)

7

在这段代码中,我得到了一个警告:因为此调用未被等待,所以在完成调用之前,当前方法的执行将继续进行。请考虑对调用结果应用“await”运算符。

    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 异步lambda表达式无法转换为表达式树

那么我如何在使用异步控制器时使用强类型的RedirectToAction呢?(我正在使用MVC Futures)


我猜你需要编写一个扩展程序,它将接受 Func<Task<ViewResult>> 或其他类似的参数,然后将其转换为 futures 版本(非异步)的表达式。 - AgentFire
嗯,我无法让它正常工作 :( - Bart Calixto
3
由于该表达式本身没有被执行,我认为除了发出的警告令人非常烦恼之外,它并没有问题。使用#pragma禁用警告似乎不是解决此问题的正确方法。希望有更聪明的人来解决这个问题。以下链接似乎与此相关:https://dev59.com/B2Af5IYBdhLWcg3w0Ve6 - miha
1个回答

3

我已经解决了这个问题!

我有一个基本控制器,其中包含一个用于异步重定向的扩展方法。

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

这将防止警告。然后您只需从Controller调用RedirectToAsyncAction。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接