Custom Excel Export Action
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)
{
HttpC开发者_高级运维ontext 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);
}
}
I'm really just confused on how to use this action in my controller. I got this from the internet but I am just having a hard time figuring out how I would define it in my controller and pass data to it and get data back from an AJAX call.
Any help would be awesome. Thanks.
As with all action results you would return them from an action:
public ActionResult Foo()
{
SomeViewModel model = ...
return new ExcelResult<SomeViewModel>
(
ControllerContext,
"~/Views/Home/Foo.ascx",
"Foo.xlsx",
model
);
}
In this example the Foo
partial is strongly typed to a view model and contains the data.
精彩评论