模型数据未发送到控制器
本文关键字:控制器 数据 模型 | 更新日期: 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
属性的Include
d,因为所有其他提交的表单数据都将被删除。