【问题标题】:Call back from server to client从服务器回调到客户端
【发布时间】:2015-06-14 13:02:04
【问题描述】:

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

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

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

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

【问题讨论】:

  • 请编辑您的问题并添加您的代码。不看你的代码很难回答你的问题。
  • 添加代码请帮忙
  • 请显示您的查看代码,只显示您要显示消息的部分。
  • @{ ViewBag.Title = "上传数据到 SVN"; }

    @ViewBag.Message
    --显示文件名
  • -- 在每个 foreach 的视图中显示消息

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


【解决方案1】:

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

控制器:

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);

        });
    });

});

开始新任务……

【讨论】:

  • 这是客户端到服务器我希望服务器调用客户端方法.. 如下所示,但要显示在 UI 中
【解决方案2】:

你必须写一个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 并在ExecuteResult 方法中编写你的foreach 代码。

更新:

您可以使用 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);

【讨论】:

  • Thnaks 但是如何在 UI 中显示响应消息
  • 嘿有一个问题我在用户点击提交按钮时调用控制器。@using (Html.BeginForm("Index", "Home", FormMethod.Post, new { id = "formUpload" , enctype = "multipart/form-data", onsubmit = "progressStatus();" })) {
    上传文件
    @ViewBag.Message

    }
  • 如果我调用函数 progressStatus() { debugger; var oReq = new XMLHttpRequest(); oReq.open("get", "/Home/ProcessMessage", true); oReq.send(); setInterval(showResult, 1000);函数 showResult() { if (result !== oReq.responseText) { result = oReq.responseText; $("#progressbar").html(结果); } } } 在
    我收到 HTTP 错误
  • 请不要通过 SO 共享代码。对话流必须在网站中永久存在,通过谷歌驱动器永久共享大量代码不是一个好主意。最好具体谈谈错误。请提供有关您遇到的异常或 http 错误的更多详细信息。
  • 我的问题是我在
    ,所以如果我调用这个方法,我会在 c# context.HttpContext.Response.Flush();如何调用提交方法和 Javascript 方法,因为按钮是提交它正在调用我的控制器的索引。在 progressStatus 方法中,我有你给出的代码。输入在 @using (Html.BeginForm("Index", "Home", FormMethod.Post, new { id = "formUpload", enctype = "multipart/form-数据”}))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-22
  • 2018-04-13
  • 1970-01-01
相关资源
最近更新 更多