Как обновить модель при привязке к ViewModel? - PullRequest
15 голосов
/ 05 мая 2011

У меня есть [HttpPost] подпись метода действия, подобная этой:

[HttpPost]
public ActionResult Edit(ExistingPostViewModel model)
{
   // Save the edited Post.
}

Теперь, в прошлом (когда я не использовал ViewModels, например, R & D), у меня была реализация Отредактируйте метод, подобный следующему:

[HttpPost]
public ActionResult Edit(Post model)
{
    var existingPost = repo.Find(model.Id);
    TryUpdateModel(existingPost);
    repo.Save(existingPost);  
    return RedirectToAction("Success", existingPost.Id);
}

, который отлично работал.

Но я запутался, как адаптировать вышеизложенное к подходу ViewModel.

Еслия делаю это:

TryUpdateModel(existingPost)

С моим подходом ViewModel мало что происходит.Нет ошибок, но ничего не обновляется, потому что MVC не знает, как обновить Post с ExistingPostViewModel (до того, как это было Post -> Post).

Теперь ям с помощью AutoMapper.Поэтому я подумал, что могу сопоставить ViewModel с Post и сохранить запись.

Но тогда я в основном все переопределяю.Что я не хочу делать и побеждает точку урезанной ViewModel.

Может кто-нибудь меня не смущает?

Это похоже на очень распространенный сценарий, и я совершенно ошеломлен тем, как люди решают это.Я вижу только 3 возможных решения:

  1. Не используйте ViewModel в HTTP POST.Как я уже сказал, я делал это в прошлом для исследований и разработок, и это работает, но теперь я вижу, как развивались мои виды (проверка, простота), и я не могу пойти на компромисс только ради этой проблемы.

  2. Не используйте TryUpdateModel.Возможно, но тогда как мне объединить изменения?

  3. Использовать слева направо.Тьфу.Но в данный момент это похоже на то, как я склоняюсь.

Кто-то, пожалуйста, дайте мне решение № 4!:)

Кстати, я использую ASP.NET MVC 3, Razor и Entity Framework.

Ответы [ 3 ]

2 голосов
/ 05 мая 2011

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

Единственная приятная вещь в этом подходе - он дает вамбольше контроля.Поскольку я начал использовать больше составных моделей представления, где у вас фактически есть поля из более чем одной сущности в вашей модели представления, стало более разумно делать вещи таким образом.

Я также использую AutoMapper, и выСовершенно верно, это становится неловко, когда вы пытаетесь выполнить простую операцию обновления.Хотелось бы, чтобы у меня был какой-то очень умный обходной путь, но «старомодный способ», кажется, лучше справляется с работой, которую я выполняю.

0 голосов
/ 18 апреля 2016

Не уверен, поможет ли это, но это работает для меня. У меня есть базовая таблица доменов в качестве объекта посетителя. Моя viewmodel содержит объект посетителя плюс несколько IEnumerables для выпадающих меню.

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Edit(int id)

    {
        Visitor Visitor = new Visitor();
        Visitor = db.Visitors.FirstOrDefault(v => v.VisitorID == id);

        UpdateModel(Visitor, "Visitor");

        db.SaveChanges();
        return RedirectToAction("Index");

    }

UpdateModel отрабатывает мою viewmodel из-за строки «Visitor», сообщающей ей, какие значения сравнивать.

0 голосов
/ 05 мая 2011

Для простых вещей, когда вам не нужно запускать какие-либо элементы управления перед внедрением обновления, то все, что вы делаете, нормально (db.get (), а затем обновление).

Когда все усложняется,Вы должны загрузить объект, а затем выбрать и применить изменения пользователя из модели представления, свойство за свойством.В этих случаях вы заканчиваете тем, что пишете методы Update, которые получают новые данные в качестве входных данных, а затем загружаете существующую сущность, затем сравниваете состояния и выполняете необходимые действия на основе данных модели представления.На самом деле в этом случае, вероятно, у вас не будет метода Update, но вы будете иметь такие поведения, как CancelPost, AddComment, EditPost (который также регистрирует причину редактирования), AddTagsToPost и т. Д.

...