为什么这段代码会抛出NULL异常

时间:2012-09-02 15:50:01

标签: asp.net-mvc-3 file

我在选择文件时有以下代码。但无论我选择哪个文件,我都会遇到以下异常:

  

无法将值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);
}

2 个答案:

答案 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添加一个隐藏字段。提交表单时,只有输入字段(不是标签)不会传递给控制器​​...