我在选择文件时有以下代码。但无论我选择哪个文件,我都会遇到以下异常:
无法将值NULL插入到ImgPath列中。
似乎文件没有将任何值传递给控制器,我做错了什么?
create.cshtml:
<div class="editor-label">
@Html.LabelFor(model => model.ImgPath)
</div>
<div class="editor-field">
<input type="file" name="file" />
</div>
家庭控制器:
public ActionResult Create(TopSong topsong, HttpPostedFileBase file)
{
if (ModelState.IsValid)
{
//verify user has selected file
if (file != null && file.ContentLength > 0)
{
var fileName = Path.GetFileName(file.FileName);
var path = Path.Combine(Server.MapPath(
"~/Content/themes/base/images/Movie Images"), fileName);
file.SaveAs(path);
}
db.TopSongs.Add(topsong);
db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.DateId = new SelectList(db.TopDates, "DateId", "DateId",
topsong.DateId);
return View(topsong);
}
答案 0 :(得分:1)
您永远不会在您的热门歌曲对象上设置ImgPath属性。您在视图中有一个标签,但不指定值。如果我正确地读了你的代码,你需要将图像路径和其他东西一起存储在数据库中,所以你只需要添加一行:
topsong.ImgPath = path;
但是,正如你的代码现在一样,即使用户没有上传图像(你的保存在if语句之外),看起来你总是会保存一首热门歌曲。通过重构你的函数并减少嵌套,这应该做你想做的事情
public ActionResult Create(TopSong topsong, HttpPostedFileBase file)
{
if (!ModelState.IsValid)
{
ViewBag.DateId = new SelectList(db.TopDates, "DateId", "DateId", topsong.DateId);
Return this.View(topsong);
}
//verify user has selected file
if (file == null || file.ContentLength == 0)
{
ViewBag.DateId = new SelectList(db.TopDates, "DateId", "DateId", topsong.DateId);
ModelState.AddModelError("file", "You must choose a file to upload.");
Return this.View(topsong);
}
var fileName = Path.GetFileName(file.FileName);
topsong.ImgPath = Path.Combine(Server.MapPath("~/Content/themes/base/images/Movie Images"), fileName);
file.SaveAs(topsong.ImgPath);
db.TopSongs.Add(topsong);
db.SaveChanges();
return RedirectToAction("Index");
}
答案 1 :(得分:0)
我猜你需要为ImgPath添加一个隐藏字段。提交表单时,只有输入字段(不是标签)不会传递给控制器...