我有一个简单的asp.net mvc应用程序,带有一些开发控件。主屏幕有一个按钮,从屏幕上取日期并进行后端处理。 VIEW:
@Html.DevExpress().Button(settings =>
{
settings.Name = "LoadData";
settings.Text = "Load Data";
settings.ToolTip = "Imports data from Holding API";
settings.ClientSideEvents.Click = "OnClick";
settings.UseSubmitBehavior = false;
}).GetHtml()
function OnClick(s, e) {
positionDate = ReportingPositionDate.GetDate().toDateString();
$.ajax({
type: "POST",
//url: "/ImportData/DataFileUpload",
url: "@Url.Action("DataFileUpload", "ImportData")",
data: JSON.stringify({ positionDate: positionDate }),
dataType: "text",
contentType: "application/json; charset=utf-8",
beforeSend: function () { lpImport.Show(); },
success: function (msg)
{
ImportDataGridView.PerformCallback();
ImportSuccessMessage.SetVisible(true);
ImportSuccessMessage.SetText(msg);
lpImport.Hide();
},
Error: function (xhr) {
alert(xhr)
ImportDataGridView.PerformCallback();
}
});
}
}
控制器:
[HttpPost]
public ActionResult DataFileUpload(string positionDate)
{
// Reset validation error collection
ImportDataValidationErrors = new List<ImportFileRecord>();
string[] errs;
try
{
ReturnVal ="Some Long Running Process"
return Content(ReturnVal);
}
catch (Exception ex)
{
throw ex;
}
}
过程大约需要50分钟(或更长时间)才能运行(预期)。控制器方法DataFileUpload在返回View时正确执行所有操作,它只是挂起。我的猜测是我的屏幕超时并且不接受来自控制器的任何响应。 当我使用较小的数据集运行相同的过程时,从Controller查看获取值。知道这里可能出现什么问题吗?我的按钮设置有问题吗? 感谢所有帮助。
答案 0 :(得分:0)
Jquery Ajax默认超时值为0.这意味着ajax中没有超时。如果浏览器有一些超时,那么你完全可以点击它。
只有在指定了超时选项时,jQuery才会调用setTimeout()。
还有另一个挑战。 ajax(XMLHttpRequest)存在浏览器超时,它对于每个浏览器尤其对于IE而言是不同的。我猜它大约30分钟左右。
从技术上讲,您可以将timeout : 10000000
设置为2.30~3小时。
我之前遇到过这个问题。你可以用进度条来解决。使用进度条,您可以保持刷新视图。
对于您可以使用的简单ajax请求。
function uploadFile(){
myApp.showProgressDialog; //show dialog
var file=document.getElementById('fileName').files[0];
var formData = new FormData();
formData.append("file_name", file);
ajax = new XMLHttpRequest();
ajax.upload.addEventListener("progress", ProgressBarHandler, false);
ajax.addEventListener("load", OnCompleteHandler, false);
ajax.open("POST", "/to/action");
ajax.send(formData);
}
function ProgressBarHandler(event){
var percent = (event.loaded / event.total) * 100;
$('.bar').width(percent); // its coming from css
}
function OnCompleteHandler(){
myApp.hidePleaseWait(); //hide dialog
$('.bar').width(100);
}