Результат Excel не дает мне ничего, но работает нормально - PullRequest
1 голос
/ 24 февраля 2011

Я использую этот AJAX для вызова моего действия экспорта в Excel на контроллере:

$("#ExportToExcel").click(function () {
        // ajax call to do the export
        var urlString = "<%= System.Web.VirtualPathUtility.ToAbsolute("~/mvc/Indications.cfc/ExportToExcel")%>";
        var Jsondata =
                {
                    id: GetGUIDValue(),
                    viewName: "<%= VirtualPathUtility.ToAbsolute("~/Views/Indications/TermSheetViews/Swap/CashFlows.aspx")%>",
                    fileName: 'Cashflows.xls'
                }
        $.ajax({
            type: "POST",
            url: urlString,
            data: Jsondata,
            success: function (data) {

            }
        });
    });

Вот как выглядит действие:

public ActionResult ExportToExcel(Guid? id, string viewName, string fileName)
        {
            IndicationBase indication = CachedTransactionManager<IndicationBase>.GetCachedTransactions(id.Value);
            return new ExcelResult<Chatham.Web.Models.Indications.ModelBase>
            (
                ControllerContext,
                viewName,
                fileName,
                indication.Model
            );
        }

Firebug проходит нормально, без ошибоки код не выдает ошибки при запуске, но на экране ничего не появляется.Я ожидаю увидеть диалоговое окно сохранения для сохранения файла Excel.

Что я делаю не так?

РЕДАКТИРОВАТЬ: Вот мое пользовательское действие,

public class ExcelResult<Model> : ActionResult
    {
        string _fileName;
        string _viewPath;
        Model _model;
        ControllerContext _context;

        public ExcelResult(ControllerContext context, string viewPath, string fileName, Model model)
        {
            this._context = context;
            this._fileName = fileName;
            this._viewPath = viewPath;
            this._model = model;
        }
         protected string RenderViewToString()
        {
            using (var writer = new StringWriter())
            {
                var view = new WebFormView(_viewPath);
                var vdd = new ViewDataDictionary<Model>(_model);
                var viewCxt = new ViewContext(_context, view, vdd, new TempDataDictionary(), writer);
                viewCxt.View.Render(viewCxt, writer);
                return writer.ToString();
            }
        }
        void WriteFile(string content)
        {
            HttpContext context = HttpContext.Current;
            context.Response.Clear();
            context.Response.AddHeader("content-disposition", "attachment;filename=" + _fileName);
            context.Response.Charset = "";
            context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
            context.Response.ContentType = "application/ms-excel";
            context.Response.Write(content);
            context.Response.End();
        }

        public override void ExecuteResult(ControllerContext context)
        {
            string content = this.RenderViewToString();
            this.WriteFile(content);
        }
}

Ответы [ 2 ]

2 голосов
/ 24 февраля 2011

Вы не можете вызвать загрузку файла по запросу ajax, потому что браузер не будет вызывать всплывающее окно загрузки файла.

Вместо вызова ajax вашего метода контроллера просто используйте

windows.open("yoururl/ExportToExcel?id=yourid&etc...", null, null, null);

И не забудьте добавить свои аргументы.

Надеюсь, это поможет

0 голосов
/ 24 февраля 2011

Мой экспорт в Excel реализован с использованием FileContentResult .Он заботится о настройках заголовков ответа для вас.Нет смысла изобретать велосипед.; -)

Не знаю, будет ли это полезно, но я могу порекомендовать библиотеку EPPlus для загрузки и обработки файлов Excel.

МожетВы пытаетесь конвертировать ваш POST в GET и просто визуализировать тег напрямую?Я не думаю, что IE выбирает расположение контента во время запроса AJAX.

...