如何在asp中呈现控制器数据。净视图

时间:2017-09-15 15:35:03

标签: c# asp.net asp.net-mvc http

我有一个网络应用,其中包含以下功能:

  1. 从MS Excel文件中提取数据
  2. 处理数据并根据特定标准将其存储在数据结构中。
  3. 将数据结构从控制器传递到可以呈现它们的视图。
  4. 我在前几个步骤中遇到的问题。在我的视图页面上,我有一个用户可以上传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设置以实现我概述的内容?

1 个答案:

答案 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);
}