In Short: Как успешно редактировать запись БД без необходимости включать каждое отдельное поле для Модели внутри Редактирования вида?Успешная Редактирование Модели без кучи скрытых полей
UPDATE
Так у меня есть элемент в БД (статьи). Я хочу отредактировать статью. Статья, которую я редактирую, имеет много свойств (Id, CreatedBy, DateCreated, Title, Body). Некоторые из этих свойств никогда не должны меняться (например, Id, CreatedBy, DateCreated). Поэтому в моем Редактированном представлении мне нужны только поля ввода для полей, которые можно изменить (например, Title, Body). Когда я реализую Edit View, как это, сбой привязки модели. Любые поля, в которые я не подавал входные данные, получают значение «по умолчанию» (например, DateCreated устанавливается в 01/01/0001 12:00:00). Если I do подает входные данные для каждого поля, все работает нормально, и статья редактируется, как ожидалось. Я не знаю, правильно ли сказать, что «сбой привязки модели» обязательно, так как «система заполняет поля неверными данными, если в окне редактирования не было введено поле ввода».
Как создать редактируемый вид таким образом, чтобы мне нужно было вводить поля ввода для полей, которые могут/нуждаются в редактировании, так что, когда вызывается метод 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>
. . .
Если бы я выйти из этих двух входов:
@Html.HiddenFor(model => model.CreatedBy)
@Html.HiddenFor(model => model.DateCreated)
когда вызывается метод Edit, они имеют значения по умолчанию. CreatedBy установлен в Null, Дата создания устанавливается в 01/01/0001 12:00:00 утра
Почему они не установлены в значения, так как они в настоящее время установлен в БД?
Вы также можете использовать TryUpdateModel (existingArticle) вместо установки каждого поля. Некоторое решение может показаться не слишком изящным, но есть такие решения, как AutoMapper, которые вы можете использовать позже, что решит эту проблему, но сейчас вам не нужно это знать. – LukLed
Но если это «правильный» способ, конечно, я хочу знать это сейчас;) Я делал немного копания, и похоже, да, использование этих вещей под названием «ViewModels» - это путь: a способ «показать фрагмент информации из одного объекта». По-видимому, это немного больше работы, но по мере того, как модели/представления становятся более сложными, они держатся сильными, в то время как эти другие методы «грубой силы» имеют тенденцию разрушаться. –