我正在开发一个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);
}
如何发送或找出未发送的原因?
答案 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参数。此参数将自动填充表单数据,您可以检查确切的键名称及其值。此外,您必须注意Include
与Bind
属性相关的内容,因为所有其他提交的表单数据都将被清除。