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);
}
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 –
Hey @GeoffJames, ich habe es versucht. Ich bekomme immer noch einen Objekt-Referenzfehler. – Sicypher
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 –