假设我有一个用于返回excel文件的控制器操作,但同时我也需要从同一个方法中抛出一个视图。即。我还需要返回excel并返回到UI,以确认excel是导出的还是什么
public ActionResult ExportReports(string pickProg, string stateKey, string key, string nextUrl, string pageMode, string prntopt)
{
ExcelExportCriteria excelExportCriteria = new ExcelExportCriteria()
{
PickProg = pickProg,
StateKey = stateKey,
Key = key,
nexturl = nextUrl,
PageMode = pageMode,
prntopt = prntopt
};
ExcelExportModel exportModel = Sagitta.Domain.Model.AMSTransfer.ExcelExport.ExportReports(excelExportCriteria);
if (exportModel.HasQuery == false)
{
//Below Returns File, I want result on view as well with this
return ExportFileContent(exportModel.OutputResults.OutputXML, exportModel.OutputResults.DataFile);
//return Json(exportModel, JsonRequestBehavior.AllowGet);
}
else
{
return new HttpStatusCodeResult((int)HttpStatusCode.InternalServerError);
}
}
另外需要注意的是:如果需要编写脚本,我想以纯javascript方式使用它,因为请求源自.asp页面和vbscript并且正在使用javascript。
答案 0 :(得分:1)
我可以从mvc中的一个操作方法一次返回两个结果吗?
没有。但是您可以在(视图)模型中返回一个具有多个值的ActionResult
。
因为任何一个HTTP请求只能有一个响应。
我建议您返回状态视图,并让状态视图启动Excel文件的下载。
答案 1 :(得分:1)
我建议重定向到"成功"页面,当它加载时,通过AJAX您请求Excel文件(这也需要一种端点来下载此文件)。
答案 2 :(得分:1)
尝试使用2种不同的操作方法。第一个返回html到客户端,第二个返回excel文件。浏览器将首先调用第一个,第二个将通过javascript调用
答案 3 :(得分:0)
您只能从一个HTTP请求中返回一个response
。因此,您可以将view
和download url
放在response
内,并使用ajax
处理这两者。在第一次调用成功后进行第二次调用会产生事务/一致性问题。我处理了如下所示的类似场景。
我在MVC操作中将view
转换为html,并将其与download url
属性一起返回。
public string RenderRazorViewToString(string viewName, object model)
{
ViewData.Model = model;
using (var sw = new StringWriter())
{
var viewResult = ViewEngines.Engines.FindPartialView(ControllerContext,
viewName);
var viewContext = new ViewContext(ControllerContext, viewResult.View,
ViewData, TempData, sw);
viewResult.View.Render(viewContext, sw);
viewResult.ViewEngine.ReleaseView(ControllerContext, viewResult.View);
return sw.GetStringBuilder().ToString();
}
}
并在MVC Action
i中返回以下内容:
return Json(new { downloadUrl= "url", htmlView= RenderRazorViewToString("_View", Model) });
上面的代码将所需的数据返回给Ajax回调。
$.ajax({
type: 'POST',
url: '/Reports/ExportMyData',
data: '{ }',
contentType: 'application/json; charset=utf-8',
dataType: 'json',
success: function (returnValue) {
window.location = '/Reports/Download?file=' + returnValue.downloadUrl;
$('#uiControl').html(returnValue.htmlView);
}
});
上述ajax调用会下载文件并将html
追加到UI control
。我希望它能解决你的问题。
此解决方案是可扩展的,您可以将任意数量的参数或视图传递给ajax回调,并且您可以一次更新UI中的多个元素。