Request.Files引发未设置对象引用-MVC

时间:2018-07-10 09:47:59

标签: asp.net-mvc httppostedfilebase

我有一个奇怪的问题。

我想将上传的图像保存到项目中的文件夹中。

这是来自控制器的代码:

 ......

 if (Request.Form["InputFile"] != null)
  {
     string directory = Server.MapPath("~/Content/UploadedFiles/");
     var file = Request.Form["InputFile"];
     string filename = fileService.GetFileName(directory, Request.Form["InputFile"]);
     Request.Files[0]?.SaveAs(filename);
 }

当调试器到达此行时:

 Request.Files[0]?.SaveAs(filename);

应用程序会为Object reference not set引发Request.Files错误。

在视图中,我已添加

@using (Html.BeginForm(new { enctype = "multipart/form-data", id = "form" }))

以下是视图中的代码:

<div class="form-group" style="margin-bottom: 0px;">
     <div class="col-md-8">
      @Html.TextBox("uploadFile", "", new { @class = "form-control", @required = "required" , @onChange= "readURL(this);" })
       </div>
<div class="col-md-3">
      <div class="fileUpload btn btn-success form-control">
       <span>Browse</span>
       @Html.TextBox("InputFile", "", new { type = "file", @class = "upload", @id = "uploadBtn" })
      </div>
    </div>
  </div> 

模型中的InputFile:

public HttpPostedFileBase InputFile { get; set; }

您能否建议将所选图像保存到文件夹的尝试方法?

1 个答案:

答案 0 :(得分:1)

您正在使用BeginForm()的重载来添加路由值,而不是html属性。如果检查生成的html,则会看到<form>元素不包含enctype = "multipart/form-data"属性。

将代码更改为(替换您的控制器和动作名称)

@using (Html.BeginForm(actionName, controllerName, FormMethod.Post, new { enctype = "multipart/form-data", id = "form" }))

此外,您的模型包含一个HttpPostedFileBase属性,因此没有必要使用Request.Form["InputFile"]Request.Files[0]。只需使用(假设POST方法中模型的参数名为model

if (model.InputFile != null && model.InputFile.ContentLength > 0) {
    .... // save file

我还建议使用强类型的HtmlHelper方法

@Html.TextBoxFor(m => m.InputFile, new { type = "file", @class = "upload" })`