私はMVC3を初めて使用し、学習ツールとしてブログアプリケーションを作成しようとしています。
ブログ投稿用のデータベースオブジェクトを作成し、読み取り/書き込みアクションを備えたコントローラーを使用してコントローラーを生成し、エンティティフレームワークを使用してビューを生成してエンティティを制御しました。
編集コマンドに問題があります。ブログ投稿には約6つのプロパティがありますが、投稿のタイトルとコンテンツを変更するための編集のみを許可したいと思います。私のコードは次のとおりです。
public ActionResult Edit(int id)
{
blog_Post blog_post = db.blog_Post.Find(id);
return View(blog_post);
}
//
// POST: /Post/Edit/5
[HttpPost]
public ActionResult Edit(blog_Post blog_post)
{
if (ModelState.IsValid)
{
db.Entry(blog_post).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(blog_post);
}
@model BlogVersion1._0.blog_Post
@{
ViewBag.Title = "Edit";
}
<h2>Edit</h2>
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<legend>blog_Post</legend>
<div class="editor-label">
@Html.LabelFor(model => model.Title)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Title)
@Html.ValidationMessageFor(model => model.Title)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.PostContent)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.PostContent)
@Html.ValidationMessageFor(model => model.PostContent)
</div>
<p>
<input type="submit" value="Save" />
</p>
</fieldset>
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>
発生する問題は、パブリックActionResult Edit(blog_Post blog_post)メソッドにあります。Edit(int id)メソッドで、ブレークポイントを設定しました。blog_postがビューに適切に渡されていることがわかります(入力されているすべてのプロパティを含む)。
ただし、[HttpPost]メソッドに返されるblog_postには、UserId、DateCreatedなどのプロパティがありません。必要な外部キーがないため、db.SaveChanges呼び出しで例外が明らかにスローされます。
正しく更新するために、すべてのプロパティが2番目の編集メソッドに返されるようにするにはどうすればよいですか?