【发布时间】:2017-11-06 08:34:48
【问题描述】:
Asp.Net Core 2.0 中引入了 Razor Pages 作为创建以页面为中心的 Web 应用程序的方式,并且在许多方面比典型的控制器、视图、模型方法更容易编写。我一直在研究https://docs.microsoft.com/en-us/aspnet/core/razor-pages/ 的文档,我觉得好奇的一件事是代码隐藏文件中的操作方法利用了asyncawait 模式,因此返回Task<IActionResult> 而不是返回@ 987654326@ 标准 Asp.Net Core 操作方法的方式。我觉得这很奇怪,因为这种方法比标准 Asp.Net Core 操作方法使用的方法更复杂,而且这似乎与 Razor Pages 的设计简单性背道而驰。
来自该来源的修改示例:
public class ContactModel : PageModel {
public async Task<IActionResult> OnPostAsync() {
//Other code omitted
return Page();
}
}
作为比较,在常规的 Asp.Net Core Controller 中,相同的代码如下所示:
public class Contact: Controller {
[HttpPost]
public IActionResult OnPost() {
//Other code omitted
return View();
}
}
为什么 Razor Pages 操作方法使用返回 Task<IActionResult> 的 async await 模式,而不是使用常规 Asp.Net 核心操作方法通过简单地返回 IActionResult 使用的更简单的方法?为什么会做出这样的设计选择?
【问题讨论】:
-
因为您正在执行并等待操作中的异步调用,所以返回类型必须为
Task。你还想从你的方法中返回一些东西,所以现在你必须使用Task<T>的通用版本。 (假设编译器允许它)如果您没有使用 async/await 返回 Task,那么您的调用将不可等待,并且不会将任何结果返回给调用者。我认为你最好阅读一下 async/await 是如何工作的。 Asynchronous Programming with Async and Await -
@Igor,谢谢。我明白了,我理解异步等待模式。但是我不明白为什么选择这种模式,因为它比标准 mvc 操作方法使用的方法更复杂。我将更新我的问题以反映这一点。
-
该代码只是他们示例的一部分,与我的问题并不特别相关。我已经更新了我的问题以使用他们示例的修改版本来省略代码,这样就不会混淆其他人。
-
@Igor - 我进一步更新了我的问题,使其更清晰,并从示例中删除了无关的代码。
-
我相信您引用的示例是异步的,但这并不能阻止您通过使用与第二个代码块中相同的签名来创建同步操作(虽然不确定 HttpPostAttribute看起来像它的命名约定)。您应该根据是否进行任何异步调用来选择签名。