2013-04-17 59 views
4

它可以使用任务(System.Threading)里面的剃刀?异步加载cshtml页面内

我想要做的是这样的:我有一张表,我想要异步填充。

看代码:

@{ 
    Func<dynamic, object> preenche = 
     @<text> 
      <tr><td>oi1</td><td>oi2</td></tr> 
     </text>; 
} 

... 
<tbody> 
    @Task.Factory.StartNew(() => 
     { 
      foreach(Apontamento ap in Model.apontamentos) 
      { 
       preenche(ap); 
      } 
     }) 
</tbody> 

输出仅此:System.Threading.Tasks.Task

这可能吗?或者我可以拥有我想用Ajax做的事情?

回答

0

您不应该在视图中执行此操作。进行异步操作,但是当你开始渲染视图时,所有数据都应该准备好。

+1

这不是一个答案,我也可以想到在页面加载后加载更多数据的UI场景是理想的,并且会创建一个更加快速的界面 – BigOmega

+0

目前还不清楚OP是否想要使用异步服务器处理或AJAX调用,所以完全有可能我正在回答另一个问题。但是我不明白你的评论的其余部分与我的回答有何关系。我指出,如果你在服务器上进行异步处理,你可以在控制器中执行它,而不是在视图中。 Web场景中的更多异步操作旨在减少服务器负载并提高可伸缩性,而不是创建更加快速的接口。 – Stilgar

5

如果您希望页面呈现并立即出现,然后在稍后发生某些操作(例如,某个操作需要5秒钟才能完成),那么当数据可用时,您可以通过执行此类操作来更新页面有关.getJSON的更多信息)。在控制器

<script type="text/javascript"> 
    $.getJSON('LongRunningAsyncTask', function (result) 
    { 
     // Populate table or other actions with: result.Data 
     // ... 
    }); 
</script> 

然后你会有这样的任务:

在您Razor视图你可以添加一些JavaScript

public JsonResult LongRunningAsyncTask() 
{ 
    // Show this is async and won't render straight away... 
    System.Threading.Thread.Sleep(5000); 

    // Build up our view model 
    var viewModel = new TestViewModel(); 

    // Send back as a Json result 
    var result = new JsonResult(); 
    result.Data = viewModel; 
    return Json(result, JsonRequestBehavior.AllowGet); 
}