从服务器回叫客户端

时间:2015-06-14 13:02:05

标签: c# asp.net asp.net-mvc asp.net-mvc-4

我正在使用ASP.NET MVC 4应用程序,我需要通过从Controller向客户端发送消息来在客户端中显示消息。

我的要求是用户点击UI中的按钮,我将处理服务器上的文件,并在每个foreach文件i处理结束时在UI中显示消息。我需要在使用ASP.NET MVC的客户端中显示文件名。

任何人都可以通过每次循环从服务器调用客户端方法来帮助如何在客户端中显示消息。

我能够调用控制器和每个控制器的结束我向UI发送最终消息,但是如何发送每个foreach循环迭代?

2 个答案:

答案 0 :(得分:0)

您必须编写一个ActionResult,逐步将结果写入响应。这样你就可以在每个foreach循环迭代中向用户显示一些数据。我写了一个简单的ActionResult,每2秒写一个数字:

public class ProgressiveResult : ActionResult
{
    public override void ExecuteResult(ControllerContext context)
    {
        for (int i = 0; i < 20; i++)
        {
            context.HttpContext.Response.Write(i.ToString());
            Thread.Sleep(2000);
            context.HttpContext.Response.Flush();
        }
        context.HttpContext.Response.End();
    }
}

这是一个返回此结果的操作:

public ActionResult LongProcess()
{
   return new ProgressiveResult();
}

因此,您可以撰写ActionResult并在foreach方法中编写ExecuteResult代码。

<强>更新

您可以使用Ajax请求进行此调用,并使用以下代码返回结果:

var result = "";
function showResult() {
    if (result !== oReq.responseText) {
        result = oReq.responseText;
        console.log(result);
    }
}
var oReq = new XMLHttpRequest();
oReq.open("get", "/Home/LongProcess", true);
oReq.send();
setInterval(showResult, 1000);

答案 1 :(得分:0)

试试这个: 脚本方法,根据您想要的预定义间隔更新进度

控制器:

public class HomeController : Controller
{
    private static IDictionary<Guid, int> tasks = new Dictionary<Guid, int>();

    public ActionResult Index()
    {
        return View();
    }

    public ActionResult Start()
    {
        var taskId = Guid.NewGuid();
        tasks.Add(taskId, 0);

        Task.Factory.StartNew(() =>
        {
            for (var i = 0; i <= 100; i++)
            {
                tasks[taskId] = i; // update task progress
                Thread.Sleep(50); // simulate long running operation
            }
            tasks.Remove(taskId);
        });

        return Json(taskId);
    }

    public ActionResult Progress(Guid id)
    {
        return Json(tasks.Keys.Contains(id) ? tasks[id] : 100);
    }
}

查看:

<script type="text/javascript">

function updateMonitor(taskId, status) {
    $("#" + taskId).html("Task [" + taskId + "]: " + status);
}

$(function () {

    $("#start").click(function (e) {
        e.preventDefault();

        $.post("Home/Start", {}, function (taskId) {

            // Init monitors
            $("#monitors").append($("<p id='" + taskId + "'/>"));
            updateMonitor(taskId, "Started");

            // Periodically update monitors
            var intervalId = setInterval(function () {

                $.post("Home/Progress", { id: taskId }, function (progress) {
                    if (progress >= 100) {
                        updateMonitor(taskId, "Completed");
                        clearInterval(intervalId);
                    } else {
                        updateMonitor(taskId, progress + "%");
                    }
                });

            }, 100);

        });
    });

});

开始新任务......