0

ファイルを選択している次のコードがあります。しかし、どのファイルを選択しても、次の例外が発生します。

列 ImgPath に値 NULL を挿入できません。

ファイルがコントローラーに値を返していないようです。何か間違っていますか?

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

2 に答える 2

1

最上位の曲オブジェクトに ImgPath プロパティを設定することはありません。ビューにラベルがありますが、それは値を割り当てません。私があなたのコードを正しく読んだ場合、画像のパスを他のものと一緒にデータベースに保存する必要があるため、次の 1 行を追加するだけで済みます。

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 に答える