Привет, я изо всех сил пытаюсь найти правильный подход к SO для того, что я сейчас делаю, поэтому я думал, что попрошу.Отображение ViewModel с SelectList в MVC3
Вот мой упрощенный код:
Субъектами вложенные типы, основанные на использовании их с EF CodeFirst и ViewModel в настоящее время отображается с AutoMapper.
При публикации формы ModelState недействительно из-за того, что выпадающий список отображается на model.CourseId и отображает мои данные курса .. ie CourseId = 2, CourseList = Null, но также имеет атрибут [Обязательный], действительно только CourseId требуется, но мне также понадобилось соответствующее сообщение об ошибке.
Я подумал, что в моих действиях POST Create GET & POST, вероятно, должен быть только CourseId, но мне все равно нужно отображать его как выпадающее меню и заполнить его, и я не знал, как это сделать правильно.
Возможно, я также не понимаю, как это следует использовать правильно, и если мне даже нужно CourseName, то есть, поскольку курс уже существует в базе данных, мне просто нужен внешний ключ, который все равно позволит мне показать выбранный курс ,
Я также планирую вывести все это сопоставление и настройку данных в своих действиях контроллера в отдельный слой службы, но на данный момент это небольшой прототип.
// 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);
}
}
Если свойство CourseId является обязательным, добавьте атрибут '[Обязательный]', а не в список ... Но поскольку он не может быть нулевым, вам может и не понадобиться. Удалите его из списка. –
Упрощение вещей ive сделало его несколько запутанным .. CourseId имеет атрибут [Обязательный] в модели сущности, используемый для создания необходимого поля в базе данных sql compact через EFCodeFirst. Возможно, я ошибался, думая, что он переносит это на мою модель представления, потому что ранее я использовал объекты напрямую. Я удалил атрибут Required из свойства CourseList, что было ошибкой. – Pricey
Поскольку ответов пока нет, я бы обновил источник на этом, а также разместил точные сообщения об ошибках. –