Udana edycja modelu bez wielu ukrytych pól
W skrócie: Jak pomyślnie edytować wpis DB bez konieczności dołączania każdego pojedynczego pola dla Modelu w Widoku Edycji?
AKTUALIZACJA
Więc mam przedmiot w DB (artykuł). Chcę edytować artykuł. Artykuł, który edytuję, ma wiele właściwości (Id, CreatedBy, DateCreated, Title, Body). Niektóre z tych właściwości nigdy nie muszą się zmieniać (np. Id, CreatedBy, DateCreated). W moim widoku edycji chcę tylko pola wejściowe dla pól, które można zmienić (np. Tytuł, Treść). Kiedy implementuję widok edycji w ten sposób, wiązanie modelu kończy się niepowodzeniem. Wszystkie pola, których nie dostarczyłem, otrzymują wartość „domyślną” (np. DateCreated jest ustawiana na 01/01/0001 12:00:00). Jeśli jarobić dostarczaj dane wejściowe dla każdego pola, wszystko działa poprawnie, a artykuł jest edytowany zgodnie z oczekiwaniami. Nie wiem, czy poprawne jest stwierdzenie, że „wiązanie modelu kończy się niepowodzeniem”, tyle że „system wypełnia pola błędnymi danymi, jeśli w widoku edycji nie podano dla nich pola wejściowego”.
W jaki sposób mogę utworzyć widok edycji w taki sposób, że muszę tylko dostarczyć pola wejściowe dla pól, które mogą / wymagają edycji, tak że po wywołaniu metody edycji w kontrolerze pola takie jak DateCreated są wypełniane poprawnie i nie są ustawiane na jakąś domyślną, niepoprawną wartość? Oto moja metoda edycji w obecnym stanie:
[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");
}
I widok edycji, jeśli pomaga:
. . .
@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>
. . .
Gdybym miał pominąć te dwa wejścia:
@Html.HiddenFor(model => model.CreatedBy)
@Html.HiddenFor(model => model.DateCreated)
po wywołaniu metody edycji są ustawione na wartości domyślne. CreatedBy jest ustawiony naZero, Utworzono ustawienie na01/01/0001 12:00:00
Dlaczego nie są ustawione na wartości, które są obecnie ustawione w DB?