MVC刷新视图

时间:2012-05-10 14:12:15

标签: c# asp.net-mvc-3 asynchronous

我有一个控制器,如下所示:一堆电子邮件:

  public ActionResult Index()
    {
        ViewBag.Message = "Email Results.";

        emailQueue.emailQueueCompleted += EmailsCompleted;
        emailQueue.Run();


        List<EmailError> emails = new List<EmailError>();


        return View(emails);
    }

但是,emailQueue.Run()是一个异步任务,在呈现视图时尚未完成。当它随后完成时,它在下面的同一控制器中调用此方法:

   public void EmailsCompleted(List<EmailError> errors)
    {
        if (errors.Count > 0)
        {
            // Do some stuff

           // Re-render view with updated errors if possible
        }
    }

无论如何,我的问题是,一旦我在电子邮件队列完成任务后得到更新的错误列表,我是否可以轻松地在此控制器中重新呈现视图?或者我应该等待电子邮件完成,甚至在最初尝试渲染视图之前(请记住,这可能是一个相当长的过程)。由于MVC通常不是我热衷于深入研究的领域,所以建议一如既往。

1 个答案:

答案 0 :(得分:0)

你的架构似乎有点错误。您有效地询问“我如何进行客户端更新以显示运行何时完成?”

你应该考虑改变一切;首先渲染您的视图,然后调用一些ajax开始发送电子邮件。然后,一旦发送电子邮件,页面就会得到响应(记住在ajax调用上设置超时以等待更长时间),然后可以适当地呈现新元素。

<强>另外

通常情况下,这类事情可能最好不在Web应用程序中,更适合Windows服务。然后,您可以根据您的数据库状态,通过页面简单地呈现指示批量发送状态的页面。