模型数据未发送到控制器

时间:2015-12-30 19:45:25

标签: c# entity-framework asp.net-mvc-5

我正在开发一个ASP.NET MVC5项目;具体来说,我正在开发CodePlex Music Store示例(可在此处找到https://mvcmusicstore.codeplex.com/)。 但是,我创建了一个具有实体视图的控制器(Album),当我尝试运行编辑操作时,当它尝试将更改保存到数据库时抛出此异常(虽然一切都适用于其他操作,如delete和创建):

  

存储更新,插入或删除语句会影响意外的行数(0)。自那以后,实体可能已被修改或删除   实体已加载。

我在保存更改时添加了一个断点,结果发现一些模型数据(包括AlbumId)没有发送;其中一些是发送的,其他的是空的。我确信AlbumId包含在视图中:

@using (Html.BeginForm())
{
  @Html.AntiForgeryToken()

  <div class="form-horizontal">
    <h4>Album</h4>
    <hr />
    @Html.ValidationSummary(true, "", new { @class = "text-danger" })
    @Html.HiddenFor(model => model.AlbumId)...

以下是控制器中处理请求的操作

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Edit([Bind(Include = "AlbumId,GenreId,ArtistId,Title,Price,AlbumArtUrl")] Album album)
    {
        if (ModelState.IsValid)
        {
            db.Entry(album).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        ViewBag.ArtistId = new SelectList(db.Artists, "ArtistId", "Name", album.ArtistId);
        ViewBag.GenreId = new SelectList(db.Genres, "GenreId", "Name", album.GenreId);
        return View(album);
    }

如何发送或找出未发送的原因?

1 个答案:

答案 0 :(得分:0)

我认为您的代码应该像这样修改:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit([Bind(Include = "AlbumId,GenreId,ArtistId,Title,Price,AlbumArtUrl")] Album album)
{
    if (ModelState.IsValid)
    {
        // entity is attached to the context, so that it is tracked and its changes saved
        db.Attach(album);
        db.Entry(album).State = EntityState.Modified;
        db.SaveChanges();
        return RedirectToAction("Index");
    }
    ViewBag.ArtistId = new SelectList(db.Artists, "ArtistId", "Name", album.ArtistId);
    ViewBag.GenreId = new SelectList(db.Genres, "GenreId", "Name", album.GenreId);
    return View(album);
}

如果您的album中有未填充的属性,检查提交的数据的一种方法是在方法中添加FormCollection参数。此参数将自动填充表单数据,您可以检查确切的键名称及其值。此外,您必须注意IncludeBind属性相关的内容,因为所有其他提交的表单数据都将被清除。