0

我在选择文件的地方有以下代码。但无论我选择什么文件,我都会得到以下异常:

无法将值 NULL 插入 ImgPath 列。

似乎文件没有将任何值传递回控制器,我做错了吗?

创建.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);
}
4

2 回答 2

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");  
}
于 2012-09-02T16:39:22.117 回答
0

我猜你需要为 ImgPath 添加一个隐藏字段。提交表单时,只有输入字段(不是标签)不会传递给控制器​​...

于 2012-09-02T15:54:55.737 回答