【发布时间】:2016-09-07 10:27:05
【问题描述】:
我正在使用 ASP.NET MVC 4,我正在尝试将图像上传到目录并将图像名称写入我的数据库;但是,文件名显示为空,并且当 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>
}
这是Controller中的HttpPost Create()方法:
[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);
}
【问题讨论】:
-
您是否尝试在检查/保存文件之前创建一个局部变量,并将其值设置为
file.FileName?然后你可以在你的foreach循环中引用这个变量 -
嘿@GeoffJames,我试过这样做。我仍然收到对象引用错误。
-
好的,所以
file本身就是null,如果我理解正确?确保在您的表单中,您将文件字段的name和id设置为file,并设置表单的enctype="multipart/form-data"并确保方法为post -
@GeoffJames 你知道对象引用错误出了什么问题吗?
-
您需要在
@Html.BeginForm助手中设置一些东西 - 您缺少重要的一点"enctype="multipart/form-data"以便将文件传递给控制器,请参阅下面的答案:)
标签: c# asp.net-mvc entity-framework asp.net-mvc-4 entity-framework-5