Как обновить объект домена с помощью ViewModel и AutoMapper с помощью Entity Framework? - PullRequest
0 голосов
/ 28 июля 2011

Как мне обновить объект домена с помощью ViewModel с AutoMapper с использованием Entity Framework?

У меня есть View для редактирования сущности Вопроса.

Это мое действие по редактированию:

    public ActionResult Edit(int id)
{
    var question = db.Question.Single(q => q.question_id == id);

    Mapper.CreateMap<Question, EditQuestionViewModel>();
    EditQuestionViewModel eqvm = Mapper.Map<Question, EditQuestionViewModel>(question);

    eqvm.QuestionTypes = new SelectList(db.Question_Type, "type_code", "type_description", question.type_code);
    eqvm.Categories = new SelectList(db.Category, "category_id", "category_name", question.category_id);

    eqvm.Visibility = new SelectList(new Dictionary<int, string> {
        { 1, "Ja"},
        { 0, "Nej"}
    }, "Key", "Value");

    return View(eqvm);
}

И моя ViewModel выглядит так:

 public class EditQuestionViewModel
{
    public int question_id { get; set; }
    public string question_wording { get; set; }
    public bool visible { get; set; }
    public int question_number { get; set; }
    public string help_text { get; set; }
    public Category Category { get; set; }
    public Question_Type Question_Type { get; set; }

    public string SelectedCategory { get; set; }
    public string SelectedQuestionType { get; set; }
    public SelectList Categories { get; set; }
    public SelectList QuestionTypes { get; set; }
    public SelectList Visibility { get; set; }
    public string RefUrl { get; set; }

}

Это представление:

    @using (Html.BeginForm("Edit", "AdminQuestion", FormMethod.Post))
{
    @Html.ValidationSummary(true)

    <fieldset>
        <legend>Spørgsmål</legend>
        <div class="editor-label">
            @Html.LabelFor(model => model.question_wording, "Spørgsmål")
        </div>
        <div class="editor-field">
            @Html.TextAreaFor(model => model.question_wording, new { @class = "required", rows = 3, cols = 50 })
            @Html.ValidationMessageFor(model => model.question_wording)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.SelectedCategory, "Hvilken kategori tilhører dette spørgsmål?")
        </div>
        <div class="editor-field">
            @Html.DropDownListFor(model => model.SelectedCategory, Model.Categories)
            @Html.ValidationMessageFor(model => model.SelectedCategory)
        </div>
        <div class="editor-label">
            @Html.LabelFor(x => x.SelectedQuestionType, "Spørgsmålstype")
        </div>
        <div class="editor-field">
            @Html.DropDownListFor(model => model.SelectedQuestionType, Model.QuestionTypes)
            @Html.ValidationMessageFor(model => model.SelectedQuestionType)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.visible, "Skal dette spørgsmål være synligt?")
        </div>
        <div class="editor-field">
            @Html.DropDownListFor(model => model.visible, Model.Visibility)
            @Html.ValidationMessageFor(model => model.visible)
        </div>

          <div class="editor-label">
            @Html.LabelFor(model => model.question_number, "Hvilket nummer har spørgsmålet inden for sin kategori?")
        </div>
        <div class="editor-field">
            @Html.TextBoxFor(model => model.question_number, new { @class = "required digits" })
            @Html.ValidationMessageFor(model => model.question_number)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.help_text, "Hjælpetekst som hjælper brugeren med at forstå spørgsmålet:")
        </div>
        <div class="editor-field">
            @Html.TextAreaFor(model => model.help_text, new { rows = 20, cols = 50 })
            @Html.ValidationMessageFor(model => model.help_text)
        </div>
        <br />
        <input type="submit" value="Gem" />

    </fieldset>

Как обновить сущность при отправке формы?Как должно выглядеть отображение между ViewModel и EF Model с использованием AutoMapper?

Свойства

public string SelectedCategory { get; set; }
public string SelectedQuestionType { get; set; }

В ViewModel должны быть связаны с category_id и type_code в модели EF

Также обратите внимание на свойство

public bool visible { get; set; }

Я использую BIT в своей базе данных.Будет ли это работать со значениями 0 и 1, которые используются в SelectList?

Спасибо!

Ответы [ 2 ]

1 голос
/ 28 июля 2011

вам нужно будет получить объект из структуры сущностей, а затем использовать автоматическое копирование следующим образом:

var item = repository.getbyid(model.Id);
_mappingEngine.Map(viewModel, item);
repository.save(item);
0 голосов
/ 28 июля 2011

Когда вы отправляете свою форму, вам нужно выполнить действие на вашем контроллере, которое будет обрабатывать сообщение на сервере.

Таким образом, в дополнение к действию «Изменить», которое у вас есть в данный момент, вам нужно определить другое действие, например:

[HttpPost]
public ActionResult Edit(EditQuestionViewModel model)
{
    //Do the mapping to from your ViewModel to the EF model here

    return View();
}

Это устанавливает обработчик так, чтобы ваша форма могла отправлять данные обратно в контроллер, и это связывает ваши поля в форме с параметром модели.

Как только вы это сделаете, вы можете просто отобразить модель обратно в EF и сохранить ее в базе данных.

Кроме того, использование bool вполне допустимо, и EF переведет и сохранит его как 0 или 1 в базе данных для вас.

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