模型数据未发送到控制器

本文关键字:控制器 数据 模型 | 更新日期: 2023-09-27 18:28:29

我正在处理一个ASP.NET MVC5项目;特别是我正在研究CodePlex音乐商店的例子(可以在这里找到https://mvcmusicstore.codeplex.com/)。然而,我为一个实体(相册)创建了一个带有视图的控制器,当我试图运行编辑操作时,当它试图将更改保存到数据库时,会引发此异常(而其他操作(如删除和创建)一切正常):

存储更新、插入或删除语句影响了意外的行数(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);
    }

我如何发送它或找出为什么没有发送它?

模型数据未发送到控制器

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

[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参数。此参数将自动填充表单数据,您可以检查确切的密钥名称及其值。此外,您必须注意具有Bind属性的Included,因为所有其他提交的表单数据都将被删除。