为什么 Razor 页面返回的是 Task<IActionResult> 而不是 IActionResult?

3
Razor Pages是在Asp.Net Core 2.0中引入的一种创建以页面为中心的Web应用程序的方式,与典型的控制器、视图、模型方法相比,许多方面更容易编写。我一直在研究https://learn.microsoft.com/en-us/aspnet/core/razor-pages/上的文档,其中一个我觉得很奇怪的事情是,在代码后台文件中的操作方法利用了async await模式,因此返回一个Task<IActionResult>而不是像标准的Asp.Net Core操作方法一样返回IActionResult。我发现这种方法比标准的Asp.Net Core操作方法更复杂,这似乎与Razor Pages的设计简单性相矛盾。
来自该来源的修改后的示例:
  public class ContactModel : PageModel {

    public async Task<IActionResult> OnPostAsync() {
        //Other code omitted

        return Page();
    }
  }

作为比较,在普通的Asp.Net Core控制器中,这段代码看起来像:

 public class Contact: Controller {

    [HttpPost]
    public IActionResult OnPost() {           
        //Other code omitted

        return View();
    }
 }

为什么Razor Pages的操作方法使用asyncawait模式返回Task<IActionResult>,而不像常规的Asp.Net核心操作方法那样简单地返回IActionResult?为什么做出这样的设计选择?

1
因为您在操作中执行并等待异步调用,所以返回类型必须是“Task”。您还想从方法中返回一些内容,因此现在必须使用Task<T>的泛型版本。 (假设编译器允许它)如果您没有使用async/await返回Task,则无法等待您的调用,并且无法将结果返回给调用者。我认为最好您阅读有关async/await如何工作的内容。使用Async和Await进行异步编程 - Igor
那段代码只是他们示例的一部分,与我的问题并不特别相关。我已经更新了我的问题,使用了修改过的示例版本来省略代码,以免混淆其他人。 - RonC
@Igor - 我进一步更新了我的问题,使其更加清晰,并从示例中删除了不必要的代码。 - RonC
1
我相信你所参考的示例是异步的,但这并不妨碍你通过使用第二个代码块中相同的签名来创建同步操作(不确定 HttpPostAttribute 是否符合命名约定)。你应该根据是否进行任何异步调用来选择签名。 - Igor
我相信你是正确的。鉴于这是Razor页面的介绍文档,如果不必要使用这种方法,他们以async await示例开始是很奇怪的,特别是考虑到所有操作方法本质上都是异步的,因为它们在中间件之后被调用,而中间件使用了异步等待。但根据您的评论,我能够在此页面上找到一个示例:https://dzone.com/articles/creating-simple-shoutbox-using-aspnet-core-razor-p,证实Razor页面实际上可以简单地返回IActionResult。如果您将您的回复作为答案,我会接受它。 - RonC
显示剩余5条评论
1个回答

1
我认为你参考的示例是异步的,但这并不妨碍你创建一个同步操作,只需使用第二个代码块中相同的签名即可(关于 HttpPostAttribute 我不确定,因为它看起来像是命名约定)。
public IActionResult OnPost() {  /* code here */ }

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