在我的MVC網站上有用於處理數據的顯示按鈕。這個按鈕調用ActionResult方法「ProcessData」。如何取消當前從另一個ActionResult方法運行的ActionResult方法?
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方法?請介紹我。
P.S.對不起,英語不好。
編輯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部分。你打電話使用阿賈克斯? – praga2050
你不能(它們是2個單獨的請求) –
'ProcessData'和'CancelProcessData'帶有不同的請求(它們都被聲明爲'ActionResult'),似乎你不能從另一個方法請求中取消HTTP請求,如果第一個請求已經開始。 –