0

私はASP.NET MVC 4を使用しています。画像をディレクトリにアップロードして、データベースに画像の名前を書き込もうとしています。しかし、ファイル名がヌルで表示されています。オブジェクト参照がオブジェクトのインスタンスに設定されていません。コントローラのHttpPost Create()メソッドのパラメータである場合、HttpPostedFileBaseファイル変数のエラーエラーです。ここでディレクトリに画像をアップロードし、画像の名前をデータベースに書き込む

は、モデルでのファイル名です:

public string ImageName { get; set; } 

これはビューである:ここでは

@using (Html.BeginForm()) { 
    @Html.AntiForgeryToken() 
    @Html.ValidationSummary(true) 

    <fieldset> 
     <legend>Expense</legend> 
<div class="editor-label"> 
      @Html.LabelFor(model => model.ImageName) 
     </div> 
     <div class="editor-field"> 
      <input type="file" name="file" /> 
     </div> 


     <p> 
      <input type="submit" value="Create" /> 
     </p> 
    </fieldset> 
} 

はコントローラでHttpPost作成()メソッドです。

[HttpPost] 
     [ValidateAntiForgeryToken] 
     [Authorize] 
     public ActionResult Create(Expense expense, HttpPostedFileBase file) 
     { 
      if (ModelState.IsValid) 
      { 

       var fullName = db.UserProfiles.Where(u => u.UserId == expense.UserId).Select(n => n.FullName).ToArray()[0]; 

       if (file.ContentLength > 0) 
       { 
        var fileName = Path.GetFileName(file.FileName); 
        var path = Path.Combine(Server.MapPath("~/Images/" + fullName), fileName); 
        file.SaveAs(path); 
       } 

       var query = 
        from e in db.Expenses 
        where e.ExpenseId == expense.ExpenseId 
        select e; 

       foreach (Expense exp in query) 
       { 
        exp.ImageName = file.FileName; 
       } 

       db.Expenses.Add(expense); 
       db.SaveChanges(); 
       return RedirectToAction("Index"); 
      } 

      var errors = ModelState.Values.SelectMany(v => v.Errors); 
      ViewBag.UserId = new SelectList(db.UserProfiles, "UserId", "UserName", expense.UserId); 
      return View(expense); 
     } 
+0

はあなたが/チェックファイルを保存する前に、ローカル変数を作成してみましたこの値を 'file.FileName'に設定していますか?そして、あなたは 'foreach'ループでこの変数を参照することができます –

+0

ちょっと@GeoffJames、私はそれをやろうとしました。私はまだオブジェクト参照エラーを取得します。 – Sicypher

+0

OKだから、 'file'自体は' null'です、私が正しく理解すれば?フォームの 'name' _and_' id''を 'file'に設定し、フォームの' enctype = "multipart/form-data"を設定し、メソッドが 'post'であることを確認してください。 –

答えて

2

フォームにenctype"multipart/form-data"に設定されていることを確認して、コントローラにファイルを送信する必要があります。あなたの@Html.BeginForm()方法で

、あなたには、いくつかのパラメータを渡す必要があります。

actionは、あなたがこのような場合には( "Create")に投稿しているアクションの名前であり、そして controllerはの名前です
@Html.BeginForm(action, 
       controller, 
       FormMethod.Post, 
       new { enctype="multipart/form-data"}) // <-- Important for uploading files 

アクションがオンになっているコントローラ(インスタンスではわかりませんが、例として"ExpenseController")。

また、<input ...idnameの属性が両方とも設定されていることを確認したいと思います。

希望すると便利です。

EDIT
また、このように、Html.BeginForm方法のためにあなたの行動やコントローラのparamsとしてnullnullを渡すことができます。

@Html.BeginForm(null, null, FormMethod.Post, new { enctype="multipart/form-data"}) 
+0

チャームのように働きました!Thanks Geoff!:-) – Sicypher

関連する問題