为什么razor页面返回任务<;IActionResult>;而不是结果?
在Asp.NETCore2.0中引入了Razor页面,作为创建以页面为中心的web应用程序的一种方法,并且在许多方面比典型的控制器、视图和模型方法更易于编写。我一直在研究上的文档,我发现一件奇怪的事情是代码隐藏文件中的操作方法使用了为什么razor页面返回任务<;IActionResult>;而不是结果?,razor,asp.net-core-mvc,Razor,Asp.net Core Mvc,在Asp.NETCore2.0中引入了Razor页面,作为创建以页面为中心的web应用程序的一种方法,并且在许多方面比典型的控制器、视图和模型方法更易于编写。我一直在研究上的文档,我发现一件奇怪的事情是代码隐藏文件中的操作方法使用了asyncwait模式,因此返回任务,而不是像标准Asp.Net核心操作方法那样返回IActionResult。我觉得这很奇怪,因为这种方法比标准Asp.Net核心操作方法使用的方法更复杂,而且似乎与Razor页面的设计简单性背道而驰 来自该来源的修改示例: pu
async
wait
模式,因此返回任务
,而不是像标准Asp.Net核心操作方法那样返回IActionResult
。我觉得这很奇怪,因为这种方法比标准Asp.Net核心操作方法使用的方法更复杂,而且似乎与Razor页面的设计简单性背道而驰
来自该来源的修改示例:
public class ContactModel : PageModel {
public async Task<IActionResult> OnPostAsync() {
//Other code omitted
return Page();
}
}
为什么Razor Pages操作方法使用
async
wait
模式返回任务
,而不是使用常规Asp.Net核心操作方法通过简单返回IActionResult
使用的更简单方法?为什么会做出这样的设计选择?我相信您引用的示例是异步的,但这并不会阻止您通过使用与第二个代码块中相同的签名来创建同步的操作(虽然不确定httpposattribute
的命名约定)
因为您正在执行并等待操作中的异步调用,所以返回类型必须是
Task
。您还希望从方法中返回一些内容,因此现在必须使用任务的通用版本。(假设编译器允许)如果您没有使用async/await返回任务,那么您的调用将不可等待,并且无法将结果返回给调用方。我认为您最好阅读async/await的工作原理@伊戈尔,谢谢。我明白了,我理解异步等待模式。但我不明白为什么选择这种模式,因为它比标准mvc操作方法使用的方法更复杂。我将更新我的问题以反映这一点。该代码只是他们示例的一部分,与我的问题无关。我已经更新了我的问题,以使用他们示例的修改版本来省略代码,这样就不会混淆其他人。@Igor-我进一步更新了我的问题,使其更清晰,并从示例中删除了无关的代码。我相信您引用的示例是异步的,但这并不会阻止您创建一个不同步的操作只需使用与第二个代码块中相同的签名即可实现同步(但不确定HttpPostAttribute,因为它看起来像它的命名约定)。您应该根据是否进行任何异步调用来选择签名。
public class Contact: Controller {
[HttpPost]
public IActionResult OnPost() {
//Other code omitted
return View();
}
}
public IActionResult OnPost() { /* code here */ }