【问题标题】:Waiting on tasks in ASP.NET WebPages Razor view在 ASP.NET WebPages Razor 视图中等待任务
【发布时间】:2014-12-04 16:27:16
【问题描述】:

我正在使用异步/等待,并从我的一个视图调用异步方法,我需要等到它完成。 I've seen a lot of examples for ASP.NET MVC, where you can just put an "async" into the signature of your action. 但是我还没有看到任何 ASP.NET WebPages 的示例。

我是否只是在我的 Razor 视图中对返回的任务调用“Wait()”?我看到了针对 Wait() 的建议。

请给我一些关于如何从网页的 Razor 视图中正确调用异步方法的参考/示例。

【问题讨论】:

  • async/await 是核心功能,与 MVC 无关。此外,async 不会使方法异步,它允许您在已经异步的方法上使用await。只需将正确的关键字添加到您的方法中,就像使用 MVC 一样
  • 我的方法中确实有所有正确的关键字。我只需要知道如何从我的观点正确地称呼它们?

标签: c# asp.net razor async-await asp.net-webpages


【解决方案1】:

从我的一个观点调用异步方法

不要从视图中调用方法。视图实际上应该只是绑定到模型上的数据。如果要执行异步操作来获取模型的数据,请在填充模型时在控制器中执行。

作为一个人为的例子:

public class MyViewModel
{
    public string SomeValue { get; set; }
}

在控制器中:

var model = new MyViewModel
{
    SomeValue = await GetTheValue();
};
return View(model);

在视图中:

@Model.SomeValue

当模型交给视图渲染时,它本质上应该是“完整的”,而视图应该只是渲染它。异步操作应该在控制器中。


作为在控制器中放置过多代码并将其保留在模型中的替代方法,您可以将异步操作移至模型上的某种初始化:

public class MyViewModel
{
    public string SomeValue { get; private set; }

    public async Task Initialize()
    {
        SomeValue = await GetTheValue();
    }
}

然后在您的控制器中调用它:

var model = new MyViewModel();
await model.Initialize();
return View(model);

或者可能是模型上的异步工厂:

public class MyViewModel
{
    public string SomeValue { get; private set; }

    private MyViewModel() { }

    public static async MyViewModel Create()
    {
        return new MyViewModel
        {
            SomeValue = await GetTheValue()
        };
    }
}

然后在控制器中:

var model = await MyViewModel.Create();
return View(model);

确实有很多方法可以解决这个问题。主要是将异步操作保持在视图之外,其唯一工作应该是在模型完成后呈现 UI。

【讨论】:

  • 嗯,这意味着我必须将我的项目重写为 MVC。有没有办法用网页做到这一点(没有模型或控制器)?
  • @ArmanBimatov:哦,我以为这是 MVC。无论哪种方式,都适用相同的概念。渲染引擎应该只是渲染给定的数据。它不应该调用异步操作。这更像是 WebForms 吗?在这种情况下,代码隐藏将是异步操作发生的地方。
  • @ArmanBimatov:如果没有“代码隐藏”,那么您可以尝试类似var someValue = await GetTheValue(); 或var someValue = GetTheValue().Result; 这有点像废话,因为这个“网页" 事情似乎掩盖了服务器端应用程序主机结构。前一个选项可能在语法上无效(如果渲染引擎的上下文不是async),后者可能会导致死锁。如果系统在任何可测量的复杂性方面增长,“网页”可能不是最好的方法。
  • 我会第一个说:这不是最好的方法哈哈。关于您的两个担忧 - 在我的情况下它们都是正确的。
  • @ArmanBimatov:我试过谷歌搜索,文档和示例在“网页”上似乎有点少(这是一个非常通用的术语,所以很难搜索)。听起来好像顶级代码主机不是异步的,或者隐藏了它的异步性。听起来确实像切换到 MVC 会带来很多好处而无需大量投资,因为我敢打赌 大部分 代码都可以按原样粘贴到 MVC 视图中。
猜你喜欢
  • 1970-01-01
  • 2020-04-24
  • 2014-09-06
  • 2012-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多