我可以从mvc中的一个操作方法一次返回两个结果吗?

时间:2017-09-18 08:47:59

标签: javascript c# asp.net-mvc

假设我有一个用于返回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。

4 个答案:

答案 0 :(得分:1)

  

我可以从mvc中的一个操作方法一次返回两个结果吗?

没有。但是您可以在(视图)模型中返回一个具有多个值的ActionResult

因为任何一个HTTP请求只能有一个响应。

我建议您返回状态视图,并让状态视图启动Excel文件的下载。

答案 1 :(得分:1)

我建议重定向到"成功"页面,当它加载时,通过AJAX您请求Excel文件(这也需要一种端点来下载此文件)。

答案 2 :(得分:1)

尝试使用2种不同的操作方法。第一个返回html到客户端,第二个返回excel文件。浏览器将首先调用第一个,第二个将通过javascript调用

答案 3 :(得分:0)

您只能从一个HTTP请求中返回一个response。因此,您可以将viewdownload 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中的多个元素。