1

嗨,我创建了将 Gridview 转换为 excel 文件的导出类。

见下面的代码:

下载FileActionResult 类:

public class DownloadFileActionResult : ActionResult
    {


        public GridView ExcelGridView { get; set; }
        public string fileName { get; set; }


        public DownloadFileActionResult(GridView gv, string pFileName)
        {

            ExcelGridView = gv;

            fileName = pFileName;

        }



        public override void ExecuteResult(ControllerContext context)
        {

            HttpContext curContext = HttpContext.Current;
            curContext.Response.ClearContent();
            curContext.Response.AddHeader("content-disposition", "attachment; filename=" + fileName + ".xls");
            curContext.Response.ContentType = "application/vnd.ms-excel";
            StringWriter sw = new StringWriter();
            HtmlTextWriter htw = new HtmlTextWriter(sw);
            ExcelGridView.RenderControl(htw);
            curContext.Response.Write(sw.ToString());
            curContext.Response.End();

        }

    }

jQuery-ajax:

function Export(){


    var search = {};                                        
    search.Name = "MaterialShape";
    search.Description = "";
    search.Address ="";

    var url_ = generateURL("/Home/Download");                    //Call Save Controller  and pass details entities  

    $.ajax({
        type: "POST",
        url: url_,
        data: search,                                            //details will act as the Entities Model
        traditional: true,
        success: function(data) {


        },
        error: function(XMLHttpRequest, textStatus, errorThrown) {
                alert("error: " + XMLHttpRequest.responseText);
        },
        dataType: 'json'
    });

};

搜索参数属性:

public class SearchParams
    {
        public string Name{ get; set; }
        public string Description {get;set;}
        public string Address{get;set;}
        ...
     }

然后我在我的控制器上实现它:

     //Export to excel
    public ActionResult Download(SearchParam param)
    {

       List<Lookup> lookupList = data.GetLookup(param);
      var grid = new System.Web.UI.WebControls.GridView();

       grid.DataSource = lookupList;
       grid.DataBind();

       return new DownloadFileActionResult(grid, "test");

    }

当我手动输入控制器 url 时它正在工作(没有搜索参数值)

http://localhost:54928/Home/Download  

或使用 html.action 链接

<%= Html.ActionLink("Home", "/Download", "Home")%> 

但是当我使用ajax调用时它不起作用

<img src="<%=Url.Content("~/Images/export.png")%>" id="Img1" onclick="Export();" alt="Export" /> 

我真的需要使用。

我在这里遗漏了一些东西..有什么想法吗?

感谢问候

4

1 回答 1

2

使用下载 excel 文件没有意义$.ajax- ajax 调用实际上是为了在您的 js 代码中获取基于文本的数据(html.xml,JSON),以便您可以使用它。浏览器知道如何处理(例如提示保存文件)二进制内容,如excel。

在这种情况下,您只需要一个简单的 POST/GET 请求即可启动 excel 文件下载(简单如document.location = "/home/download?q=keyword";

于 2012-12-27T06:43:30.427 回答