2014-10-04 62 views
0

我想向我的ASP.NET Web應用程序添加一項功能,該功能將允許用戶上傳包含學生課程列表的文件。我添加了上傳功能到我的視圖,並在我的控制器中創建了一個新的方法。每次我選擇一個文件並點擊上傳時,出現以下錯誤:「發生了'System.NullReferenceException'類型的異常」。我猜我的文件變量即將作爲null?下面是我的控制器代碼和我的視圖代碼:文件上傳ASP.NET MVC(出現錯誤)

查看:

<div id="uploadCourseList"> 
     @using (Html.BeginForm("uploadCourseList", "ManageStudentCourses", FormMethod.Post, new { enctype = "multipart/form-data" })) 
     { 
      @Html.AntiForgeryToken() 
      @Html.TextBoxFor(x => Model.userId, @Model.userId, new { @class = "addCourseTxtBoxId" }) 
      <table class="courseListTable"> 
       <tr> 
        <th colspan="4"> 
         Upload Course List 
        </th> 
       </tr> 
       <tr> 
        <td> 
         Select a file: 
        </td> 
        <td> 
         <input type="file" name="file" id="file" /> 
        </td> 
        <td> 
         <input type="submit"> 
        </td> 
       </tr> 
      </table> 
     } 
    </div> 

控制器

public PartialViewResult uploadCourseList(HttpPostedFileBase file, courseListViewModel modelView) 
    { 
     if (file.ContentLength > 0 && file != null) 
     { 
      string path = Path.Combine(Server.MapPath("~/Content/courseList"), Path.GetFileName(file.FileName)); 
      file.SaveAs(path); 
     } 
    return PartialView("~/Views/ManageStudentCourses/listCourses.cshtml"); 
    } 
+0

你有沒有試圖在你的控制器中放置一個斷點? – ekad 2014-10-04 17:20:24

+0

檢查這個SO問題它會指導你如何上傳文件:http://stackoverflow.com/questions/25125127/asp-net-mvc-4-c-sharp-httppostedfilebase-how-do-i-store-file – 2014-10-04 17:55:12

+0

你的代碼似乎很好,在我這邊沒有任何問題。我只懷疑你的'TextBoxFor'代碼。我注意到了代碼,除此之外,一切工作正常。 – ramiramilu 2014-10-04 19:33:34

回答

0

您這裏有兩個主要問題:

  1. 屬性的表單標籤應該是enctype,而不是encrypt
  2. 您無法使用Ajax.BeginForm發送文件,至少不會像您想象的那樣輕鬆發送文件。快速解決方案是使用Html.BeginForm(),但如果這是不可接受的,那麼您可能需要查看第三方插件,例如Plupload
+0

我將它改爲Html.BeginForm,然後我將其更改爲enctype,但該文件變量仍然以空值形式進入我的控制器 – Stc5097 2014-10-04 19:10:04

+0

請您可以共享新的表單代碼嗎? :) – Tobias 2014-10-04 19:15:45

+0

上面的代碼更新:) – Stc5097 2014-10-04 19:19:43

0

空是因爲「courseListViewModel」不是因爲文件

,你可以設置斷點,並檢查它。

我發現你沒有在控制器中使用「courseListViewModel modelView」。它可以被刪除並重試嗎?

0

它看起來好像您的視圖模型不存在。如果courseListViewModel是一個實際的模型,它將在你的控制器參數中類似於HttpPostedFileBase。您可能需要在控制器的頂部添加對模型類的引用。

此外,模型似乎從視圖中缺失,您可能想在視圖的頂部添加一個 @using(yourmodels).courseListViewModel。如果你只是沒有粘貼所有的代碼,然後忘記這一點。

我會改變的另一件事是檢查您的文件是否爲空之前檢查ContentLength。 如果該文件爲空,它將以現在的方式拋出異常。