Вкратце : Как мне успешно отредактировать запись БД без необходимости включать каждое отдельное поле для модели внутри представления редактирования?
ОБНОВЛЕНИЕ
Итак, у меня есть элемент в БД (Статья). Я хочу отредактировать статью. У статьи, которую я редактирую, много свойств (Id, CreatedBy, DateCreated, Title, Body). Некоторые из этих свойств никогда не нужно менять (например, Id, CreatedBy, DateCreated).Поэтому в моем представлении «Редактировать» мне нужны поля ввода только для полей, которые можно изменить (например, «Заголовок», «Тело»). Когда я реализую такое представление редактирования, привязка модели терпит неудачу. Любые поля, для которых я не предоставил входные данные, устанавливаются на некоторое значение «по умолчанию» (например, DateCreated устанавливается на 01/01/0001 00:00:00). Если я сделаювходные данные для каждого поля, все будет работать нормально, и статья будет отредактирована, как и ожидалось. Я не знаю, правильно ли говорить, что «сбой привязки модели» обязательно, так как «система заполняет поля неверными данными, если для них не было указано поле ввода в представлении редактирования».
Как я могу создать представление редактирования таким образом, чтобы мне нужно было предоставить поля ввода только для полей, которые могут/нуждаются в редактировании, чтобы при вызове метода редактирования в контроллере такие поля, как 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>
. . .
Если бы я пропустил эти два ввода:
@Html.HiddenFor(model => model.CreatedBy)
@Html.HiddenFor(model => model.DateCreated)
при вызове метода редактирования они устанавливаются по умолчанию значения. Для CreatedBy установлено значение Null, для Created установлено значение 01/01/0001 00:00:00
Почему для них не установлены значения, установленные в настоящее время в БД?