我有一个网络应用,其中包含以下功能:
我在前几个步骤中遇到的问题。在我的视图页面上,我有一个用户可以上传excel文件的按钮。一旦他们点击提交,就发送POST请求以将文件传输到控制器操作(我使用索引操作,我不确定是否正确)从文件中提取数据。处理完文件后,我想将提取的数据显示在与上传按钮相同的页面上。
我首先尝试通过在控制器中创建一个类来实现它,该类为每个excel行实例化,然后每行存储在三个不同对象列表中的一个中。
然后我将每个列表存储在ViewBag对象中:
//Handle POST request and determine in the file uploaded was of correct type
List<Dictionary<string, string>> dictionary = new List<Dictionary<string, string>>();
bool isSuccess = true;
int colID = 0;
int colTier = 0;
if (Request != null)
{
HttpPostedFileBase file = Request.Files["UploadedFile"];
if ((file != null) && (file.ContentLength > 0) && !string.IsNullOrEmpty(file.FileName))
{
string fileName = "";
//string fileinitPath = "//app235wnd1t/equityfrontoffice/INGDS/TierBulkUpload/";
string fileinitPath = "C:/Users/chawtho/Desktop/";
Regex regex = new Regex("WTDA.+xlsx"); //find correct filename
if (match.Success)
{
fileName = (match.Value);
}
if (fileName != "")
{
Match match = regex.Match(file.FileName);
//Extract data from excel file and store in collections
ViewBag.inactive_subscriptions = inactiveSubscriptions;
ViewBag.active_subscriptions = activeSubscriptions;
}
return View();
}
在视图中我有以下内容:
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title></title>
</head>
<body>
random text
@using (Html.BeginForm("Index", "Subscription", FormMethod.Post, new { enctype = "multipart/form-data" })) {
<fieldset class="form">
<legend>Upload Document</legend>
<input type="file" name="UploadedFile" id="FileUpload" required />
<input type="submit" name="Submit" value="Upload" />
<label id="saveStatus" style="color: red">
</label>
</fieldset>
}
@{
<li>@ViewBag.inactive_subscriptions[0].ID</li>
}
在这里,我只是尝试读取订阅列表中第一个对象的ID字段,但是我收到错误:
Cannot perform runtime binding on a null reference
我不确定此错误的来源,因为在调试控制器代码时,Viewbag会在返回View()
之前填充两个列表。我还尝试将Subscription类从控制器移动到模型类,并创建了一个容器来保存订阅列表,但这并没有解决问题。
我认为问题可能与页面最初加载时打印viewbag数据的代码有关,但我不确定是否应该保持运行直到文件处理完毕。
我应该如何构建此mvc设置以实现我概述的内容?
答案 0 :(得分:1)
我把下一个例子,这是我用来操作excel文件的方式,注意我不使用viewbag变量,这可能是一个选项,就像我说过我将处理后的数据返回到json对象然后我通过javascript操纵它。
- Razor ViewPage
<!--Upload File-->
@using (Html.BeginForm("ProcessExcelFile", "ControllerName", FormMethod.Post,
new { id = "formUploadExcel", enctype = "multipart/form-data" }))
{
<div class="row">
<div class="col-md-4">
<label for="file">Excel File (.xls, .xlsx)</label>
<input type="file" name="file" id="file" required="required">
</div>
</div>
<br>
<button type="submit" class="btn btn-primary">Upload File</button>
}
- JS脚本
<script type="text/javascript">
$('form#formUploadExcel').unbind('submit').bind('submit', function () {
formdata = new FormData($('form#formUploadExcel').get(0));
$.ajax({
url: this.action,
type: this.method,
cache: false,
processData: false,
contentType: false,
data: formdata,
success: function (data, status) {
console.log(data);
},
complete: function () {
//code...
}
});
return false;
});
</script>
- 控制器
[HttpPost]
public JsonResult ProcessExcelFile(HttpPostedFileBase file)
{
// Process the excel...
var business = new BusinessLayer();
var data = business.ValidateExcel(file);
// Return the Json with the procced excel data.
return Json(data, JsonRequestBehavior.AllowGet);
}