这可能是一个奇怪的问题,但我在MVC3中有一个表单,它通过json发布到一个在幕后做很多工作的控制器。虽然这一切都在进行,但我希望将一些消息返回给用户,以便在当前状态下更新它们。 “联系服务器,提交请求”等。
似乎虽然我可以说“返回Json(新...);”到页面,我不希望在整个操作完成之前返回任何内容。那么如何在调用最终返回之前将字符串从控制器返回到页面?这首先是一件傻事吗?
答案 0 :(得分:2)
假,
您想要的通常称为“等待页面”。我刚搜索SOF的“json”等待页面“”,令人惊讶的是,没有找到任何东西。一般的方法是你的控制器拦截http“请求”“潜在的缓慢生成页面”,并立即将“等待页面”返回给用户代理。典型的“等待页面”不会就您的请求进度提供任何“真实”反馈;我想因为这样做会涉及从客户端到服务器的许多从根本上没有效益的“往返”(请求)。事实上,我的正常等待页面只是一个“处理......请等待......”消息,上面是一个“旋转齿轮”的动画GIF。 You WaitPage包含一个包含计时器的java脚本,它定期向服务器发送“我们还在那里”的请求。如果请求完成,则控制器(显然)将初始请求转发到结果页面;如果没有,控制器什么都不做,等待客户的下一次定时请求。
这是一个棘手的代码,我意识到我的回复与JSON或MVC(如此)没有任何关系;但这是过去如何处理这个问题的一般概述......似乎没有人(大声)抱怨整体效果。
干杯。基思。
答案 1 :(得分:2)
这是可能的,但我不认为我会做那样的事情=)
在您的action方法中,如果请求不是AjaxRequest,则使用您在ViewData中设置的状态消息呈现虚拟视图(也在ViewData中设置表单数据);在该视图上,将ajaxRequest发送到同一个url(如果需要,发布表单数据)并将响应附加到页面。如果请求是AjaxRequest(检入操作方法),则使用数据呈现真实视图。
在某些情况下,您可以使用一些具有真实长请求的彗星技术(例如一些大型报告)
答案 2 :(得分:0)
这违反了分层架构方法。相反,您应该在网页上使用ajax和计时器并查询控制器以获取更新。您可以使用一个消息缓冲区来存储更新。
然后,您可以编写一个单独的控制器,在主要操作正在进行时,为页面发送的每个查询返回消息缓冲区中的消息。
答案 3 :(得分:0)
您是否考虑过websockets或SignalR?上次我看起来SignalR在Web场中不起作用,但它启用了双向对话,服务器可以在适当的时候任意推送到客户端。