MVC4向后台传输数据(POST)

发布时间 2023-04-04 09:51:53作者: 贾平凡

前端

const xhr = new XMLHttpRequest()
                const fileName = '小题分表.xls'
                xhr.open('post', '@Url.Action("ExportData")', true)
                xhr.responseType = 'blob'
                //xhr.setRequestHeader('Content-Type', 'application/json;charset=utf-8')
                let self = this;
                let data = {
                    columns: self.columns,
                    students: self.data,
                    title: "小题分表"
                }
                var param = JSON.stringify(data);

                let ss = new FormData();
                ss.append('data', param);

                xhr.send(ss)
                xhr.onload = function () {
                    debugger
                    const type = xhr.getResponseHeader('Content-Type')

                    const blob = new Blob([this.response], { type: type })
                    if (typeof window.navigator.msSaveBlob !== 'undefined') {
                        window.navigator.msSaveBlob(blob, fileName)
                    } else {
                        const URL = window.URL || window.webkitURL
                        const objectUrl = URL.createObjectURL(blob)
                        if (fileName) {
                            var a = document.createElement('a')
                            // safari doesn't support this yet
                            if (typeof a.download === 'undefined') {
                                window.location = objectUrl
                            } else {
                                a.href = objectUrl
                                a.download = fileName
                                document.body.appendChild(a)
                                a.click()
                                a.remove()
                            }
                        } else {
                            window.location = objectUrl
                        }
                    }
                }

后端

[AllowAction]
        [HttpPost]
        public FileResult ExportData(string data)
        {
           
            var dataString = data.ToString();
            var paras = new
            {
                Title="",
                Columns = EmptyArr<string>(),
                Students = EmptyArr<Dictionary<string, string>>()
            };

            paras = JsonConvert.DeserializeAnonymousType(dataString, paras);

            var dt = new DataTable();

            foreach (string item in paras.Columns)
            {
                dt.Columns.Add(item);
            }
           
            foreach (Dictionary<string, string> item in paras.Students)
            {
                var row = dt.NewRow();

                foreach (var key in item.Keys)
                {
                    row[key] = item[key];
                }
                dt.Rows.Add(row);
            }

            var stream = dt.SaveToMemoryStream(paras.Title);
            return File(stream, "application/ms-excel", "成绩单.xls");
        }

  

public static T[] EmptyArr<T>()
        {
            return EmptyArray<T>.Value;
        }

        internal static class EmptyArray<T>
        {
            public static readonly T[] Value = new T[0];
        }