2012-03-27 3 views
0

Привет, я изо всех сил пытаюсь найти правильный подход к 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); 
     } 
    } 
+0

Если свойство CourseId является обязательным, добавьте атрибут '[Обязательный]', а не в список ... Но поскольку он не может быть нулевым, вам может и не понадобиться. Удалите его из списка. –

+0

Упрощение вещей ive сделало его несколько запутанным .. CourseId имеет атрибут [Обязательный] в модели сущности, используемый для создания необходимого поля в базе данных sql compact через EFCodeFirst. Возможно, я ошибался, думая, что он переносит это на мою модель представления, потому что ранее я использовал объекты напрямую. Я удалил атрибут Required из свойства CourseList, что было ошибкой. – Pricey

+0

Поскольку ответов пока нет, я бы обновил источник на этом, а также разместил точные сообщения об ошибках. –

ответ

1

Я исправил свою проблему, выполнив нижеследующее.

 [Required(ErrorMessage = "Please select a Course.")] 
    public int CourseId { get; set; } 
    // public string CourseName { get; set; } 
    public SelectList CourseList { get; set; } 

мнения будет использовать помощник DropDownListFor к карте выпадающего моему CourseId, и это все, что мне действительно нужно.

К другой проблеме теперь с AutoMapper и почему она не относится к объекту рецепта в действии POST Create.

Возможно, мне сначала нужно найти способ сохранить соответствующее название курса в свойстве «CourseName».

Смежные вопросы