C# 从服务器到客户端的回调
我正在使用ASP.NETMVC4应用程序,我需要在客户端显示消息,通过从控制器向客户端发送消息 我的要求是用户在UI中单击一个按钮,我将处理服务器上的文件,并在我处理的每个文件的末尾在UI中显示消息。我需要使用ASP.NET MVC在客户端显示文件名 任何人都可以通过每次从服务器上为每个循环调用Client方法来帮助如何在客户机中显示消息C# 从服务器到客户端的回调,c#,asp.net,asp.net-mvc,asp.net-mvc-4,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 4,我正在使用ASP.NETMVC4应用程序,我需要在客户端显示消息,通过从控制器向客户端发送消息 我的要求是用户在UI中单击一个按钮,我将处理服务器上的文件,并在我处理的每个文件的末尾在UI中显示消息。我需要使用ASP.NET MVC在客户端显示文件名 任何人都可以通过每次从服务器上为每个循环调用Client方法来帮助如何在客户机中显示消息 我可以调用控制器并结束向UI发送最终消息的每个控制器,但如何在每次foreach循环迭代中发送?您必须编写一个ActionResult,逐步将结果写入响应。因
我可以调用控制器并结束向UI发送最终消息的每个控制器,但如何在每次foreach循环迭代中发送?您必须编写一个
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();
}
}
因此,您可以在executesult
方法中编写ActionResult
和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);
试试这个:
根据所需的预定义间隔更新进度的脚本方法
控制器:
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);
}
}
公共类HomeController:控制器
{
私有静态IDictionary任务=新字典();
公共行动结果索引()
{
返回视图();
}
公共行动结果开始()
{
var taskId=Guid.NewGuid();
任务。添加(任务ID,0);
Task.Factory.StartNew(()=>
{
对于(变量i=0;i=100){
updateMonitor(任务ID,“已完成”);
clearInterval(intervalId);
}否则{
updateMonitor(任务ID,进度+“%”);
}
});
}, 100);
});
});
});
开始新任务…请编辑您的问题并添加代码。在没有看到您的代码的情况下很难回答您的问题。添加的代码请帮助请显示您的查看代码,仅显示您要显示消息的部分。@{ViewBag.Title=“将数据上载到SVN”;}
@ViewBag.Message--显示文件名--在每个foreach Thnaks上的视图中显示消息,但如何在UIHey中显示响应消息当用户单击“提交”按钮时,我正在呼叫控制器。@using(Html.begin)(“索引”,“主页”,FormMethod.Post,new{id=“formUpload”,enctype=“multipart/form data”,onsubmit=“progressStatus();”}){Upload File
@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(result);}}在
上,我收到HTTP错误,请不要通过SO共享代码。对话流必须在网站中永久存在,通过google drive永久共享这卷代码不是一个好主意。最好专门讨论错误。请提供有关您遇到的异常或http错误的详细信息。我的问题是,我正在调用
上的java脚本方法,因此,如果调用此方法,我将在c#context.HttpContext.Response.Flush()上遇到错误;如何调用submit方法和Javascript方法,因为按钮是submit,它调用的是我控制器的索引。在progressStatus方法中,我有您给出的代码..输入在@using下(Html.BeginForm(“Index”,“Home”,FormMethod.Post,new{id=“formUpload”,enctype=“multipart/form data”})),这是客户端到服务器,我希望服务器调用客户端方法。。如下图所示,但要在UI中显示
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);
});
});
});