Arm*_*tov 0 c# asp.net razor async-await asp.net-webpages
我正在使用async/await,并从我的一个视图中调用异步方法,我需要等到它完成.我已经看过很多ASP.NET MVC的例子,你可以在你的行动签名中加入"异步".但我还没有看到ASP.NET WebPages的任何示例.
我只是在Razor视图中的返回任务上调用"Wait()"吗?我见过针对Wait()的建议.
请给我一些关于如何在WebPages的Razor视图中正确调用异步方法的参考/示例.
从我的一个视图调用异步方法
不要在视图中调用方法.该视图应该只是绑定到模型上的数据.如果要执行异步操作以获取模型的数据,请在填充模型时在控制器中执行该操作.
作为一个人为的例子:
public class MyViewModel
{
public string SomeValue { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
并在控制器中:
var model = new MyViewModel
{
SomeValue = await GetTheValue();
};
return View(model);
Run Code Online (Sandbox Code Playgroud)
并在视图中:
@Model.SomeValue
Run Code Online (Sandbox Code Playgroud)
当模型被赋予要渲染的视图时,模型应该基本上是"完整的",并且视图应该只是渲染它.异步操作应该在控制器中.
作为在控制器中放置太多代码并将其保留在模型中的替代方法,您可以将异步操作移动到模型上的某种初始化:
public class MyViewModel
{
public string SomeValue { get; private set; }
public async Task Initialize()
{
SomeValue = await GetTheValue();
}
}
Run Code Online (Sandbox Code Playgroud)
然后在你的控制器中你调用:
var model = new MyViewModel();
await model.Initialize();
return View(model);
Run Code Online (Sandbox Code Playgroud)
或者可能是模型上的异步工厂:
public class MyViewModel
{
public string SomeValue { get; private set; }
private MyViewModel() { }
public static async MyViewModel Create()
{
return new MyViewModel
{
SomeValue = await GetTheValue()
};
}
}
Run Code Online (Sandbox Code Playgroud)
然后在控制器中:
var model = await MyViewModel.Create();
return View(model);
Run Code Online (Sandbox Code Playgroud)
真的,有很多方法可以解决这个问题.主要的是将异步操作保持在视图之外,其唯一的工作应该是在模型完成后呈现UI.
| 归档时间: |
|
| 查看次数: |
3039 次 |
| 最近记录: |