Привет, я изо всех сил пытаюсь найти правильный подход к SO для того, что я делаю в настоящее время, поэтому я подумал, что я спрошу.
Вот мой упрощенный код:
Объекты - это вложенные типы, основанные на использовании их с EF CodeFirst, а ViewModel сопоставляется с AutoMapper.
При публикации формы ModelState недопустим из-за того, что выпадающий список сопоставлен с model.CourseId и отображает данные моего курса .. т.е. CourseId = 2, CourseList = Null, но также имеет атрибут [Required], действительно только CourseId требуется, но мне также нужно соответствующее сообщение об ошибке.
Затем я подумал, что в моих действиях Create GET & POST представление должно иметь просто CourseId, но мне все равно нужно отобразить его в виде раскрывающегося списка и заполнить его, и я не был уверен, как это сделать правильно.
Возможно, я также не понимаю, как это следует использовать правильно, и если мне даже нужно Имя курса, то есть, поскольку Курс уже существует в базе данных, я просто хочу получить внешний ключ к нему, который все равно позволит мне показать выбранный курс.
Я также планирую разбить все эти отображения и настройки данных в действиях моего контроллера на отдельный сервисный уровень, но на данный момент это небольшой прототип.
// Entities
public class Recipe {
public int Id { get; set; }
public string Name { get; set; }
public Course Course { get; set; }
}
public class Course {
public int Id { get; set; }
public string Name { get; set; }
}
// View Model
public class RecipeCreateViewModel {
// Recipe properties
public int Id { get; set; }
public string Name { get; set; }
// Course properties, as primitives via AutoMapper
public int CourseId { get; set; }
public string CourseName { get; set; }
// For a drop down list of courses
[Required(ErrorMessage = "Please select a Course.")]
public SelectList CourseList { get; set; }
}
// Part of my View
@model EatRateShare.WebUI.ViewModels.RecipeCreateViewModel
...
<div class="editor-label">
Course
</div>
<div class="editor-field">
@* The first param for DropDownListFor will make sure the relevant property is selected *@
@Html.DropDownListFor(model => model.CourseId, Model.CourseList, "Choose...")
@Html.ValidationMessageFor(model => model.CourseId)
</div>
...
// Controller actions
public ActionResult Create() {
// map the Recipe to its View Model
var recipeCreateViewModel = Mapper.Map<Recipe, RecipeCreateViewModel>(new Recipe());
recipeCreateViewModel.CourseList = new SelectList(courseRepository.All, "Id", "Name");
return View(recipeCreateViewModel);
}
[HttpPost]
public ActionResult Create(RecipeCreateViewModel recipe) {
if (ModelState.IsValid) {
var recipeEntity = Mapper.Map<RecipeCreateViewModel, Recipe>(recipe);
recipeRepository.InsertOrUpdate(recipeEntity);
recipeRepository.Save();
return RedirectToAction("Index");
} else {
recipe.CourseList = new SelectList(courseRepository.All, "Id", "Name");
return View(recipe);
}
}