【发布时间】:2017-09-08 16:54:04
【问题描述】:
在我的 MVC 网站中有显示流程数据的按钮。此按钮调用 ActionResult 方法“ProcessData”。
public ActionResult ProcessData()
{
bool isComplete = false;
string errMessage = "";
try
{
//Calculate something that take long time.
isComplete = true;
}
catch (Exception e)
{
errMessage = e.Message;
}
return Json(new { IsComplete = isComplete, ErrorMessage = errMessage });
}
还有用于取消过程的第二个按钮。此按钮调用 ActionResult 方法“CancelProcessData”。
public ActionResult CancelProcessData()
{
bool isCancelComplete = false;
string errMessage = "";
try
{
//Cancel Process Data
isCancelComplete = true;
}
catch (Exception e)
{
errMessage = e.Message;
}
return Json(new { IsCancelComplete = isCancelComplete , ErrorMessage = errMessage });
}
- 当用户点击处理按钮时,数据正在处理中,需要很长时间。
- 我希望用户能够通过单击取消按钮来取消进程。
如何从另一个 ActionResult 方法取消当前正在运行的 ActionResult 方法?请介绍一下。
附:抱歉英语不好。
编辑 1:这是 ProcessData.cshtml 中的代码
<script>
function ProcessData() {
var actionUrl = '@Url.Action("ProcessData", "Home")';
$.ajax({
type: "POST",
url: actionUrl,
contentType: "application/Json",
success: function (result) {
if (result.IsComplete) {
var reUrl = '@Url.Action("Index", "Home")';
window.location = reUrl;
}
},
error: function () {
alert("Error");
}
});
}
function CancelProcessData() {
var actionUrl = '@Url.Action("CancelProcessData", "Home")';
$.ajax({
type: "POST",
url: actionUrl,
contentType: "application/Json",
success: function (result) {
if (result.IsComplete) {
alert("Cancel Complete");
}
},
error: function () {
alert("Error");
}
});
}
</script>
<button onclick="ProcessData();">Process Data</button>
<button onclick="CancelProcessData();">Cancel Process Data</button>
结束编辑 1
编辑2:经过我长时间的搜索。我找到了取消过程的解决方案。显示此代码
public async System.Threading.Tasks.Task<ActionResult> ProcessData()
{
bool isComplete = false;
bool isCancel = false;
string errMessage = "";
try
{
await System.Threading.Tasks.Task.Run(() => {
for (int i = 0;i< Int32.MaxValue; i++)
{
if (HttpContext.Response.ClientDisconnectedToken.IsCancellationRequested)
{
isCancel = true;
break;
}
}
});
isComplete = true;
}
catch (Exception e)
{
errMessage = e.Message;
}
return Json(new { IsComplete = isComplete, ErrorMessage = errMessage, IsCancel = isCancel });
}
下面是脚本函数
<script>
var ajaxProcessDatarequest;
function ProcessData() {
var actionUrl = '@Url.Action("ProcessData", "Home")';
ajaxProcessDatarequest = $.ajax({
type: "POST",
url: actionUrl,
contentType: "application/Json",
success: function (result) {
if (result.IsComplete) {
if (!result.IsCancel) {
var reUrl = '@Url.Action("Index", "Home")';
window.location = reUrl;
}
}
},
error: function () {
alert("Error");
}
});
}
function CancelProcessData() {
ajaxProcessDatarequest.abort();
}
</script>
结束编辑 2
【问题讨论】:
-
你能发布取消和显示按钮的 HTML 部分吗?您正在使用 ajax 调用?
-
你不能(它们是 2 个单独的请求)
-
ProcessData&CancelProcessData接受不同的请求(它们都被声明为ActionResult),如果第一个请求已经启动,您似乎无法从另一个方法请求中取消 HTTP 请求. -
@praga2050 请查看问题顶部的 HTML 部分,我正在编辑它。
-
非常感谢大家。如果没有,还有其他方法吗?请提供给我。
标签: javascript c# jquery asp.net-mvc ajax-request