2015-06-14 274 views
1

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

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

任何一个帮助如何通过每次从服务器调用客户端方法在每个循环中显示客户端中的消息。

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

+0

请编辑您的问题并添加您的代码。没有看到你的代码很难回答你的问题。 – ekad

+0

添加代码请帮助 –

+0

请显示您的查看代码,仅显示您想要显示消息的部分。 – ekad

回答

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方法。

UPDATE:

您可以拨打这个电话与一个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); 
+0

Thnaks但如何显示UI –

+0

感谢很多工作,正如我需要的方式响应消息...... –

+0

嗨有一个问题我是当用户点击提交按钮时调用控制器。@ using(Html.BeginForm(“Index”,“Home”,FormMethod。Post,new {id =“formUpload”,enctype =“multipart/form-data”,onsubmit =“progressStatus();” })) {

Upload File
@ViewBag.Message

} –

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

     }); 
    }); 

}); 

开始新的任务&hellip;

+0

这是客户端到服务器我想要服务器调用客户端方法..就像下面,但显示在用户界面 –

相关问题