我有一个简单的应用程序,它基于asp.net教程中使用的MVC音乐商店,允许用户输入他们正在观看的电视节目的详细信息,以便记录每个节目更新到哪一集。
我的应用程序中的主要实体是Show:
Public class Show
{
// a few automatic properties
public int id { get; set; }
public Genre Genre { get; set; }
}
而且还有Genre类
Public partial class Genre
{
public int GenreId { get; set; }
public string Name { get; set; }
public List<Show> Shows { get; set; }
}
我的控制器中的POST编辑方法是由VS自动生成的:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(Show show)
{
if (ModelState.IsValid)
{
db.Entry(show).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(show);
}
当我在调试器中检查数据库时,我可以看到Show对象(无论数据库中有多少个,我通过表单种子设置了两个,但通常会添加第三个)都有我输入的流派,但是在编辑操作返回视图后,Genre为空,而所有其他值都已更新。为什么会这样?
我认为可能是genre字段为空,因为我没有进行实例化,但我在哪里进行实例化呢?我不希望每次设置Show流派时都创建一个新的流派。我只想让节目具有流派引用,以便最终允许用户选择流派并查看他们关注的该流派的所有节目。
编辑:这是我的编辑视图。详情视图看起来也非常相似。
@model watchedCatalogue2.Models.Show
@{
ViewBag.Title = "Edit";
}
<h2>Edit</h2>
@using (Html.BeginForm()) {
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
<fieldset>
<legend>@Html.DisplayFor(m => m.Name)</legend>
@Html.HiddenFor(m => m.id)
<div class="editor-label">
@Html.LabelFor(m => m.Name)
</div>
<div class="editor-field">
@Html.EditorFor(m => m.Name)
@Html.ValidationMessageFor(m => m.Name)
</div>
<div class="editor-label">
@Html.LabelFor(m => m.Genre)
</div>
<div class="editor-field">
@Html.EditorFor(m => m.Genre.Name)
@Html.ValidationMessageFor(m => m.Genre.Name)
</div>
<div class="editor-label">
@Html.Label("Number of episodes")
</div>
<div class="editor-field">
@Html.EditorFor(m => m.NoEpisodes)
@Html.ValidationMessageFor(m => m.NoEpisodes)
</div>
<div class="editor-label">
@Html.Label("Number of episodes watched")
</div>
<div class="editor-field">
@Html.EditorFor(m => m.NoEpisodesWatched)
@Html.ValidationMessageFor(m => m.NoEpisodesWatched)
</div>
<div class="editor-label">
@Html.Label("Watching State")
</div>
<div class="editor-field">
@Html.DropDownListFor(m => m.State, watchedCatalogue2.Models.Show.WatchStateItems)
</div>
<div class="editor-label">
@Html.LabelFor(m => m.Description)
</div>
<div class="editor-field">
@Html.EditorFor(m => m.Description)
@Html.ValidationMessageFor(m => m.Description)
</div>
<p>
<input type="submit" value="Save" />
</p>
</fieldset>
此外,为了确保正确,我控制器中的db指的是我的CatalogueEntities类:
namespace watchedCatalogue2.Models
{
public class CatalogueEntities : DbContext
{
public DbSet<Genre> Genres { get; set; }
public DbSet<Show> Shows { get; set; }
}
}
EditorFor
,而是使用TextboxFor
等。如果您有自定义编辑器,例如针对DateTime
(尽管我倾向于使用jQuery),或者自定义模型,则可以使用。 - AndrewTextboxFor
可以添加额外的HTML属性之外,但我们一直遇到一些边角情况,这些情况让我们回到了TextboxFor
。编辑器是可以的,但需要编写自定义模板(复杂),最终导致视线不清。实际上,现在我们所有的应用程序都使用像TextboxFor
这样的自定义助手来保持简单(它们通常在内部调用TextboxFor
等)。EditorFor
在理论上很好,但我看不到有必要全局替换<input type =“text”>
。 - AndrewEditorFor
是“智能”的,并为您选择编辑器/模板。这只是多余的间接层次,会丢失一些功能。如果我想要一个文本框,我希望在html中说“textboxFor”。然后我们有了一个DropdownFor
用于下拉列表等,而无需数据注释。现在我们的html告诉我们将要呈现的内容。 - Andrew