2014-10-03 129 views
0

我目前正在開發一個ASP.NET MVC項目,用戶可以在其中插入csv和excel記錄到數據庫中並在之後進行編輯。我已經完成了excel部分,並且工作出色。但另一方面,我的csv版本甚至無法設置csv文件路徑,它總是返回null。我嘗試過不同的方法,但似乎沒有任何工作。爲什麼我的csv文件路徑總是返回null?

我的願望是保持excel版本和csv版本類似,所以我使用了httpPost,但由於某些原因,它無法獲取csv文件路徑。 有人可以看到我做錯了什麼嗎?

這是應該發送的文件路徑我家的控制器觀點:

@{ 
    ViewBag.Title = "Index"; 
} 

<h1>Index</h1> 

@using (Html.BeginForm("Import", "CSVImport", FormMethod.Post, new {enctype="multipart/form-data" })) 
{ 
    @Html.ValidationSummary(true) 
    <fieldset> 
     Select a file <input type="file" name="file" /> 
     <input type="submit" value="Upload CSV" /> 
    </fieldset> 
} 

這這裏是我的CSV進口商:

using System.Data.Common; 
using System.Text; 
using System.Data.ProviderBase; 
using System.Data.SqlClient; 
using System.Data.SqlTypes; 
using System.Data.Sql; 
using Microsoft.VisualBasic.FileIO; 

namespace BFProj2.Controllers 
{ 
    public class CSVImportController : Controller 
    { 

     // GET: CSVImport 
     //public static DataTable GetDataTabletFromCSVFile(string csv_file_path) 
     [HttpPost] 
     public ActionResult Import(HttpPostedFileBase csv_file_path) 
     { 
      DataTable csvData = new DataTable(); 
      if (csv_file_path != null && Request.Files["csv_file_path"].ContentLength > 0) 
      { 
      try 
      { 
       using (TextFieldParser csvReader = new TextFieldParser(csv_file_path.InputStream)) 
       { 

        //Solution to HDR problem: When getting to the checkbox part of the application, just keep the HDR unchecked. 
        csvReader.SetDelimiters(new string[] { "," }); 
        //Can be true depending on if the csv document rows are enclosed in quotes or not. Delimiters are set as either ; or , depending on weather the csv columns are split with ; or , 
        csvReader.HasFieldsEnclosedInQuotes = false; 
        string[] colFields = csvReader.ReadFields(); 
        foreach (string column in colFields) 
        { 
         DataColumn Titel = new DataColumn(column); 
         Titel.AllowDBNull = true; 
         csvData.Columns.Add(Titel); 

         DataColumn LastName = new DataColumn(column); 
         LastName.AllowDBNull = true; 
         csvData.Columns.Add(LastName); 

         DataColumn AbstrNum = new DataColumn(column); 
         AbstrNum.AllowDBNull = true; 
         csvData.Columns.Add(AbstrNum); 

         DataColumn PosterTitel = new DataColumn(column); 
         PosterTitel.AllowDBNull = true; 
         csvData.Columns.Add(PosterTitel); 

         DataColumn Workshop = new DataColumn(column); 
         Workshop.AllowDBNull = true; 
         csvData.Columns.Add(Workshop); 

         DataColumn Keywords = new DataColumn(column); 
         Keywords.AllowDBNull = true; 
         csvData.Columns.Add(Keywords); 

         DataColumn Institution = new DataColumn(column); 
         Institution.AllowDBNull = true; 
         csvData.Columns.Add(Institution); 

         DataColumn CollabEmail = new DataColumn(column); 
         CollabEmail.AllowDBNull = true; 
         csvData.Columns.Add(CollabEmail); 

        } 
        while (!csvReader.EndOfData) 
        { 
         string[] fieldData = csvReader.ReadFields(); 
         //Making empty value as null 
         for (int i = 0; i < fieldData.Length; i++) 
         { 
          if (fieldData[i] == "") 
          { 
           fieldData[i] = null; 
          } 
         } 
         csvData.Rows.Add(fieldData); 

        } 
        csvData = System.Data.Common.DbProviderFactories.GetFactoryClasses(); 

      ViewData.Model = csvData.AsEnumerable(); 
       } 
      } 
      catch (Exception ex) 
      { 

      } 
      } 

      return View(); 

     } 
     } 
    } 

我花了一些素材從這個: http://www.morgantechspace.com/2013/10/import-csv-file-into-sql-server-using.html

我還沒有放入大容量複製部分,它只是一個DataTable,但我想讓它這樣做再次返回homecontroller視圖之前,控制器中的所有內容,而不是放置在其他地方。

順便說一句,我是相當新的stackoverflow,所以如果有別的事情我做錯了問題相關的問我問需要指示,以改變它。

+1

歡迎所以。我可能讀到這個錯誤,但是應該將你的''命名爲'csv_file_path'而不是'file'? – Rhumborl 2014-10-03 08:50:04

+0

啊,謝謝。你是對的,可能會有些盲目的代碼,所以如果我把csv_file_path改成文件,它會識別文件路徑? – 2014-10-03 08:58:38

+0

它沒有工作。文件路徑仍然返回null。 – 2014-10-03 09:01:03

回答

0

當您發佈文件時,<input>的名稱將用作的密鑰以及操作方法的參數名稱,因此需要匹配。在你的情況下,你有<input name="file">但參數名稱csv_file_path。所以,你需要重新命名一個或另一個:

<input name="file"> 

public ActionResult Import(HttpPostedFileBase file) 
{ 
    if (file != null && Request.Files["file"].ContentLength > 0) 
    ... 
} 

<input name="csv_file_path"> 

public ActionResult Import(HttpPostedFileBase csv_file_path) 
{ 
    if (csv_file_path != null && Request.Files["csv_file_path"].ContentLength > 0) 
    ... 
} 

注意你也不需要使用Request.Files - 在HttpPostedFileBase有你需要的東西:

if (csv_file_path != null && csv_file_path.ContentLength > 0) 
+0

再次感謝您! ^^ – 2014-10-03 09:20:26

相關問題