Сопоставление ViewModel с SelectList в MVC3 - PullRequest
0 голосов
/ 28 марта 2012

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

1 Ответ

1 голос
/ 28 марта 2012

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

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

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

Теперь к другой проблеме с AutoMapper и почему она не отображается обратно на сущность Recipe в действии POST Create.

Сначала мне нужно найти способ сохранить название соответствующего курса в свойстве "CourseName".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...