Настраиваемое действие экспорта в Excel - PullRequest
0 голосов
/ 23 февраля 2011
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);
        }
    }

Я просто не понимаю, как использовать это действие в моем контроллере. Я получил это из интернета, но мне просто трудно понять, как бы я определил его в своем контроллере, передавал ему данные и возвращал данные из вызова AJAX.

Любая помощь будет потрясающей. Спасибо.

1 Ответ

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

Как и во всех результатах действия, вы должны вернуть их из действия:

public ActionResult Foo()
{
    SomeViewModel model = ...
    return new ExcelResult<SomeViewModel>
    (
        ControllerContext,
        "~/Views/Home/Foo.ascx",
        "Foo.xlsx",
        model
    );
}

В этом примере частичное Foo строго типизировано для модели представления и содержит данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...