Итак, я использовал EF Code First для успешного создания своих сущностей и запроса базы данных для отображения элементов.
Теперь я хочу предоставить способ редактирования записей.
У меня есть класс Post, который содержит:
(TypeName = "varchar")]
[Required()]
public string Headline { get; set; }
public virtual PostType PostType { get; set; }
PostType - это класс, который я написал и который имеет идентификатор и имя для классификации сообщений на новости, блоги и т. Д.
Теперь в контроллере редактирования я получаю сообщение и передаю его представлению в модели представления. Я также получаю IEnumerable различных типов записей.
На мой взгляд, я использую следующее:
<div class="formFieldContainer">
@Html.LabelFor(model => model.Post.PostType)
@Html.DropDownListFor(model => model.Post.PostType, new SelectList(Model.PostTypes, "ID", "Name"))
@Html.ValidationMessageFor(model => model.Post.PostType)
</div>
<div class="formFieldContainer">
@Html.LabelFor(model => model.Post.Headline)
@Html.EditorFor(model => model.Post.Headline)
@Html.ValidationMessageFor(model => model.Post.Headline)
</div>
На моем контроллере редактирования у меня есть следующее для обработки сообщения:
[HttpPost, ValidateAntiForgeryToken, ValidateInput(false)]
public ActionResult Edit(int id, FormCollection collection) {
var model = new PostViewModel();
model.Post = _pr.GetPost(id); //gets the post from my post repository
model.PostTypes = _ptr.GetPostTypes();
try {
UpdateModel(model.Post, "Post");
_pr.Save();
return RedirectToRoute("Posts", new { pageNumber = 0 }); //for now go to the homepage
} catch (Exception e) {
ModelState.AddModelError("_FORM", e.Message);
return View(model);
}
}
Теперь без списка типов постов и только заголовка это работает. Однако с типом поста это не так. Я получаю «1 недействительно» (1 является значением списка выбора), что имеет смысл, так как моя модель Post ожидает объект PostType, а не int.
Я думал о том, чтобы сделать что-то вроде:
model.Post.PostType = model.PostTypes.Where(x => x.ID == Int32.Parse(collection.GetValues("Post.PostType")[0])).Select(p => p).FirstOrDefault();
Но 1) он не работает, так что его явно неправильный путь и 2) поскольку «Post.PostType» все еще существует, UpdateModel завершается ошибкой.
Есть идеи, как это сделать?