要するに:編集ビュー内のモデルのすべてのフィールドを含める必要なく、DB エントリを正常に編集するにはどうすればよいですか?
UPDATE
したがって、DBにアイテム(記事)があります。記事を編集したい。私が編集する記事には、多くのプロパティ (Id、CreatedBy、DateCreated、Title、Body) があります。これらのプロパティの一部 (Id、CreatedBy、DateCreated など) は変更する必要はありません。したがって、編集ビューでは、変更可能なフィールド (タイトル、本文など) の入力フィールドのみが必要です。このような編集ビューを実装すると、モデル バインディングが失敗します。入力を提供しなかったフィールドはすべて、「デフォルト」値に設定されます (DateCreated が 01/01/0001 12:00:00am に設定されるなど)。もし私がするならすべてのフィールドに入力を提供すると、すべてが正常に機能し、記事が期待どおりに編集されます。「編集ビューで入力フィールドが指定されていない場合、システムはフィールドに誤ったデータを入力する」など、必ずしも「モデル バインディングが失敗する」と言うのが正しいかどうかはわかりません。
コントローラーの Edit メソッドが呼び出されたときに、DateCreated などのフィールドが正しく入力され、設定されないように、編集できる/必要なフィールドの入力フィールドのみを提供する必要があるような方法で編集ビューを作成するにはどうすればよいですか?デフォルトの間違った値に?現在の編集方法は次のとおりです。
[HttpPost]
public ActionResult Edit(Article article)
{
// Get a list of categories for dropdownlist
ViewBag.Categories = GetDropDownList();
if (article.CreatedBy == (string)CurrentSession.SamAccountName || (bool)CurrentSession.IsAdmin)
{
if (ModelState.IsValid)
{
article.LastUpdatedBy = MyHelpers.SessionBag.Current.SamAccountName;
article.LastUpdated = DateTime.Now;
article.Body = Sanitizer.GetSafeHtmlFragment(article.Body);
_db.Entry(article).State = EntityState.Modified;
_db.SaveChanges();
return RedirectToAction("Index", "Home");
}
return View(article);
}
// User not allowed to edit
return RedirectToAction("Index", "Home");
}
そして、それが役立つ場合は編集ビュー:
. . .
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<legend>Article</legend>
<p>
<input type="submit" value="Save" /> | @Html.ActionLink("Back to List", "Index")
</p>
@Html.Action("Details", "Article", new { id = Model.Id })
@Html.HiddenFor(model => model.CreatedBy)
@Html.HiddenFor(model => model.DateCreated)
<div class="editor-field">
<span>
@Html.LabelFor(model => model.Type)
@Html.DropDownListFor(model => model.Type, (SelectList)ViewBag.Categories)
@Html.ValidationMessageFor(model => model.Type)
</span>
<span>
@Html.LabelFor(model => model.Active)
@Html.CheckBoxFor(model => model.Active)
@Html.ValidationMessageFor(model => model.Active)
</span>
<span>
@Html.LabelFor(model => model.Stickied)
@Html.CheckBoxFor(model => model.Stickied)
@Html.ValidationMessageFor(model => model.Stickied)
</span>
</div>
<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.Body)
</div>
<div class="editor-field">
@* We set the id of the TextArea to 'CKeditor' for the CKeditor script to change the TextArea into a WYSIWYG editor. *@
@Html.TextAreaFor(model => model.Body, new { id = "CKeditor", @class = "text-editor" })
@Html.ValidationMessageFor(model => model.Body)
</div>
</fieldset>
. . .
これら 2 つの入力を省略した場合:
@Html.HiddenFor(model => model.CreatedBy)
@Html.HiddenFor(model => model.DateCreated)
Edit メソッドが呼び出されると、既定値に設定されます。CreatedBy はNullに設定され、Created は01/01/0001 12:00:00am に設定されます
DB で現在設定されている値に設定されていないのはなぜですか?