0

Ich benutze ASP.NET MVC 4 und versuche ein Bild in ein Verzeichnis hochzuladen und schreibe den Bildnamen in meine Datenbank; Allerdings wird der Dateiname Null angezeigt und ich bekomme eine Objektreferenz nicht auf eine Instanz eines Objekts Fehler für die HttpPostedFileBase Dateivariable festgelegt, wenn es ein Parameter in der HttpPost Create() -Methode in meinem Controller ist. HierBild in Verzeichnis hochladen und Bildname in Datenbank schreiben

ist der Dateiname im Modell:

public string ImageName { get; set; } 

Dies ist die Ansicht:

@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> 
} 

Hier ist die Httppost Create() Methode im Controller:

[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

Haben Sie versucht, eine lokale Variable zu schaffen, bevor Sie die Datei überprüfen/speichern , und den Wert von diesem auf den 'file.FileName' setzen? Dann kannst du diese Variable in deiner foreach-Schleife referenzieren –

+0

Hey @GeoffJames, ich habe es versucht. Ich bekomme immer noch einen Objekt-Referenzfehler. – Sicypher

+0

OK, also ist 'Datei' selbst' null', wenn ich das richtig verstehe? Stellen Sie in Ihrem Formular sicher, dass Sie den 'name' _and_' id' des Dateifeldes auf 'file' gesetzt haben, und legen Sie die' enctype = "multipart/form-data" des Formulars fest und stellen Sie sicher, dass die Methode 'post' ist –

Antwort

2

Sie müssen sicherstellen, dass das enctype des Formulars auf "multipart/form-data" festgelegt ist, damit es Dateien an den Controller sendet.

In Ihrer @Html.BeginForm() Methode, müssen Sie einige Parameter zu übergeben:

@Html.BeginForm(action, 
       controller, 
       FormMethod.Post, 
       new { enctype="multipart/form-data"}) // <-- Important for uploading files 

Wo action der Name der Aktion ist es, Sie zu ("Create") in diesem Fall sind Entsendung und controller ist der Name der Controller, dass die Aktion eingeschaltet ist (weiß es nicht in Ihrer Instanz, aber als Beispiel "ExpenseController").

Auch möchte ich sicherstellen, dass die id und name Attribute des <input ... beide gesetzt sind.

Hoffe, das hilft!

EDIT
Sie können auch null und null als Aktion und Controller params für die Html.BeginForm Methode, wie dies passieren:

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

Arbeitete wie ein Zauber! Danke Geoff! :-) – Sicypher