15

나는ViewModel에 바인딩 할 때 모델을 업데이트하는 방법은 무엇입니까?

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

이제는 과거에 (예 : R & D와 같이 ViewModels를 사용하지 않았을 때) 구현을했다. 메서드를 다음과 같이 수정했다. :

[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는 ExistingPostViewModel에서 Post를 업데이트하는 방법을 알지 못하기 때문에 (Post ->Post 이전에는) 오류가 발생하지 않지만 아무것도 업데이트되지 않습니다.

이제 AutoMapper를 사용하고 있습니다. 그래서 ViewModel에서 Post로 매핑 한 다음 게시물을 저장할 수 있다고 생각했습니다.

하지만 기본적으로 모든 것을 무시하고 있습니다. 내가 싫어하고 ViewModel을 잘라내는 것의 핵심을 무너 뜨리고 싶습니다.

누구든지 나를 혼란스럽게 할 수 있습니까?

이것은 정말 일반적인 시나리오처럼 보입니다. 사람들이 어떻게 이것을 해결하는지에 관해서는 완전히 혼란 스럽습니다. 가능한 해결책은 세 가지뿐입니다.

  1. HTTP POST에서 ViewModel을 사용하지 마십시오. 내가 R & D에 대해 이것을 과거에했다고 말했기 때문에 작동하지만, 이제는 내 View의 진화 (검증, 단순성)를 보았습니다.이 문제를 위해 타협 할 수는 없습니다.

  2. TryUpdateModel을 사용하지 마십시오. 가능할지 모르지만 어떻게 변경 사항을 병합합니까?

  3. 왼쪽에서 오른쪽으로 쓰기. 응. 하지만 지금이 순간이 기울고있는 것처럼 보입니다.

누군가 제게 해결책 4를주세요! :)

안녕, 난 ASP.NET MVC 3, 면도기 및 엔티티 프레임 워크를 사용하고 있습니다.

답변

2

저는 현재 실제로 작업하고있는 프로젝트에서이 똑같은 문제에 부딪혔습니다. 필자가 그다지 관심이 없었던만큼 왼쪽에서 오른쪽으로 접근하여 수동으로 내 뷰 모델 데이터를 내 엔터티에 다시 매핑했습니다.

이 접근법에 대한 유일한 좋은 점은 더 많은 제어를 제공한다는 것입니다. 뷰 모델에서 둘 이상의 엔티티의 필드가 실제로있는 복합보기 모델을 사용하기 시작한 이래로 이런 방식으로 작업하기가 더 쉬워졌습니다.

나는 또한 AutoMapper를 사용하고 있으며, 당신이 옳다면 간단한 업데이트 작업을 할 때 어색해집니다. 내가 당신을 위해 몇 가지 훌륭한 영리한 해결 방법을 갖기를 바랍니다. 그러나 "구식 방식"은 제가 해왔 던 일에 최선을 다하는 것처럼 보입니다.

+0

Noooo :) 나는 왼쪽에서 오른쪽으로 할 때마다 신경 쓰지 않는다. 그러나 이것은 모든 업데이트 페이지가 그것을 할 필요가 있음을 의미한다. 이를 위해 일반적으로/간단한 방법이 있어야합니다. 모든보기에서 ViewModel을 사용합니다. 따라서 데이터베이스를 업데이트해야하는 모든보기에는 L-R이 필요합니다. 게다가 숨겨진 필드도 필요합니다. 내 머리가 아파요 .... ( – RPM1984

+0

누군가 다른 사람이 와서 더 좋은 방법이 있다고 말하면서 기다리고 있었지만, 그렇지 않은 것 같아요. (+1하고 받아 들였습니다.) – RPM1984

0

업데이트를 구현하기 전에 컨트롤을 실행하지 않아도되는 일은 괜찮습니다 (db.get(), 업데이트).

복잡한 일이 발생하면 엔티티를로드 한 다음보기 모델에서 속성 별 속성을 선택하여 적용해야합니다. 이 경우 새 데이터를 입력으로 사용하는 Update 메서드를 작성한 다음 기존 엔터티를로드 한 다음 상태를 비교하고 뷰 모델 데이터를 기반으로 필요한 작업을 수행합니다. 실제로이 경우에는 아마도 Update 메서드가 없지만 CancelPost, AddComment, EditPost (편집 이유를 기록하는), AddTagsToPost 등과 같은 동작을 수행하게됩니다.

+0

그래, 나 'AddComment'와 같은 동작 메소드가 있는데, 이건 기본 CRUD 페이지로, 들어오는 ViewModel에서 제공 한 값으로 기존 객체를 업데이트하려고합니다. 간단해야합니다. 수동으로 비교해야한다고 생각할 수 없습니다. 속성의 상태를 나타냅니다. 이는 양식 전체에 숨겨진 필드가 필요함을 의미합니다. – RPM1984

0

도움이 될지 모르지만 작동하는지 나를 위해. 내 기본 도메인 테이블을 방문자 개체로 사용합니다. 내 viewmodel에는 방문객 개체와 드롭 다운에 대한 몇 가지 IEnumerable이 포함되어 있습니다.

[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 때문에 비교하기 위해 어떤 값을 말하고 "방문자"문자열의 내 뷰 모델을 사용할 수 있습니다.