2010-01-17 2 views
13

새 사이트를 개발하기 위해 MVC를 선택함으로써 나 자신이 주변에서 실시간으로 개발되는 "모범 사례"를 발견하게되었습니다. 2 주 전, NerdDinner는 제 가이드 였지만 MVC 2의 개발과 함께, 심지어 오래된 것 같습니다. 스릴 넘치는 경험이며 매일 지능형 프로그래머들과 긴밀히 접촉하는 것이 특권입니다.필드의 서브 세트로 뷰 모델 및 모델 업데이트에 관한 모범 사례

지금 당장 모든 블로그에서 똑같은 대답을 얻을 수없는 문제가 발생했습니다. 커뮤니티의 통찰력을 얻고 싶습니다. 그것은 편집 (읽기 : 편집 작업)에 관한 것입니다. 거기에있는 많은 자료, 자습서 및 블로그는 모델을 만들고보고 다루고 있습니다. 따라서이 질문에서 질문을 설명 할 수는 없지만 토론을 진행하여 내가 취해야 할 개발 경로에 대한 내 결정에 기여할 수 있기를 바랍니다.

내 모델은 이름, 주소 및 이메일과 같은 여러 필드가있는 사용자를 나타냅니다. 사실 모든 이름은 이름, 성 및 중간 이름 필드에 있습니다. 세부 정보보기에는 이러한 필드가 모두 표시되지만 한 번에 하나의 필드 세트 만 변경할 수 있습니다 (예 : 이름). 사용자는 양식을 펼치지 만 다른 필드는 위와 아래에서 계속 볼 수 있습니다. 따라서 다시 게시 된 양식에는 모델을 나타내는 필드의 하위 집합이 포함됩니다.

이것은 우리와 우리 레이아웃의 관심사에 호소하지만 여러 가지 이유로 심각한 MVC 개발자가 피하는 것입니다. 몇 가지 패턴과 모범 사례에 대해 읽었으며 viewmodel == view의 패러다임과는 관련이없는 것 같습니다. 아니면 잘못 됐어?

어쨌든 NerdDinner는 FormCollection 및 UpdateModel을 사용하여 지시합니다. 모든 null 필드는 무시됩니다. 그 이후로 MVC 커뮤니티는 MVC 2의 bug이 발견되지 않는 정도로 이러한 접근 방식을 포기했습니다. formcollection에 완전한 모델이 없으면 UpdateModel이 작동하지 않습니다.

view model pattern 대부분의 칭찬을받는 것은 사용자 지정보기 모델 개체를 포함하고 내 디자인 문제가 호환 될 수있는 유일한 사람입니다 전용 뷰 모델이 될 것으로 보인다. AutoMapper과 지미 보가 드의 ideas을 사용하여 밝아졌지만 지루한 양의 매핑이 필요합니다. 그럴 가치가 있거나 그렇지 않을 수도 있습니다. 또한 뷰와 뷰 모델간에 1 : 1 관계를 제안합니다.

이러한 디자인 패러다임을 유지하면서 필자는 확장하는 각 필드 집합에 대한보기 및 관련보기를 만들려고합니다. 뷰 모델은 각각 거의 동일하며 읽기 전용 인 필드에서만 다르고 반복 된 마크 업을 많이 포함하는 뷰가 있습니다. 이것은 나에게 어리 석다. 미래에는 두 개 또는 그 이상의 모든 필드 집합을 동시에 표시 할 수 있기를 원합니다.

나는 불꽃을 불러 일으키기를 간절히 바란다. 미리 감사드립니다.

+0

"자세히보기에는이 모든 필드가 표시되지만 한 번에 하나의 필드 세트 만 변경할 수 있습니다 (예 : 이름). "왜? 사용자가 전체 양식을 한 번에 조정할 수있게하는 것보다 더 친절한 이유는 무엇입니까? – jfar

+1

맞아요, 제가 다시 말하지만, 덜 복잡하고 컴팩트합니다. 여러 주소를 추가하고 삭제할 수는 있지만 여전히 한 페이지에 그것을 원한다면. – Martin

+0

당신은 당신의 관심사를 아주 잘 설명했다. 나는 똑같은 문제를 겪어 왔고 Jimmy Bogard가 묘사 한 1 : 1 View : ViewModel 패턴으로 움직였다. 여러 도메인 모델이있는 ViewModels 매핑 – WDuffy

답변

0

나는 똑같은 문제가 있지만 잘 작성하지 못합니다.

내 경우에는 여러 사용자가 여러 역할을 기반으로 다른 양식을 볼 수 있기 때문에 많은 수의 ViewModel이있을 것입니다. viewModel과 View의 1 : 1 관계는 매우 모호합니다. 꽤 간단하게 EditorForModel을 사용하는 uber-View를 작성하면 훨씬 더 많지 않을까요? 이제는 모든 것을보기 위해 매우 열화되었지만보기 하나가 있으므로 ViewModel도 하나뿐입니다.

내 아이디어는 리플렉션 (즉, 컴파일 타임에 알려진 정보)뿐만 아니라 현재 사용자의 역할에 의해 관리되는 (도메인 특정) 런타임 규칙에 따라 작동하는 EditorForModel을 작성하는 것이 었습니다. 현재 시간 등결과적으로, 유효성 검증과 함께 Custom ModelBinder을 작성하고 Model에서 ViewModel 로의 사용자 정의 맵핑을 작성해야합니다. 여전히, 이것은 어리 석고 오류가 발생하기 쉬운 코드를 작성하지 못하게합니다.

내 모델 (또는 DomainModel)에 많은 논리가 포함되어 있으므로 ModelBinding을 통해 수정하지 않으려합니다. 또한 컴파일 타임에 어떤 필드가 존재하는지 알 수 없기 때문에 적절한 ViewModel을 제공하는 것은 불가능합니다. 그러나, '최대', 즉 최대 ViewModel이 알려져있다. ViewModel에서 Model 로의 매핑은 커스텀 코드를 필요로하지만, 규칙을 공식화 할 수 있다면 그 코드가 제대로 작동합니다.

죄송합니다. 제 텍스트는 매우 혼란 스럽지만 지금 당장 혼란 스럽습니다. C.T와 마찬가지로, 논평도 할 수 없었다.

+0

ValueInjecter http://valueinjecter.codeplex.com/을 사용하고 FormCollection (또는 Request)을 엔터티에 매핑 (자동으로 완료 됨), 샘플 asp.net mvc 응용 프로그램이 있습니다. 이걸 보여주는 다운로드 – Omu

2

최근에 모델 유효성 검사와 관련된 게시물이 몇 개있어서 Brad Wilson의 게시물 "Input Validation vs. Model Validation in ASP.NET MVC"이 게시되었습니다.

초기 문제는 ASP.NET MVC가 게시 된 모델의 유효성 검사를 처리 한 방법과 모델의 요소가 편집되지 않고보기에 필드를 제공하지 않았지만 컨트롤러가 전체 모델로 작업하고 있었기 때문에 누군가가 추가 필드가있는 컨트롤러에 POST를 만들 수 있습니다.

따라서 특정 모델보기를 사용하면 편집 할 필드 만 편집 할 수 있습니다.

0

확인해보세요. 이것은 (에 obj를,에서 OBJ) ASP.NET MVC 2

 public void Update(MyModel model) 
     { 
      var myModelObject = MyRepository.GetInstance(model.Id); 
      if(myModelObject != null) 
      { 
       ModelCopier.CopyModel(model, myModelObject); 
      } 
      MyRepository.Save(myModelObject); 
     } 

ModelCopier.CopyModel로 갈 수있는 방법입니다 최신 MvcFutures의 새로운 기능입니다. 또한 내가 이런 식으로 일을하고 2.

+0

감사합니다. – Martin

+0

실제로 뷰 모델을 사용하지는 않지만 실제 엔터티의 일시적인 복사본 인 것 같습니다. – UpTheCreek

3

(매핑이 ValueInjecter와 모델 빌더 내에서 자동으로 을 수행) MVC 선물의 확장 모델 바인더를 체크 아웃하십시오 :

을 나는 샘플 ASP가 .NET-MVC 내가 MVC에서이 일의 모범 사례를 보여 응용 프로그램, 당신은 download of the valueinjecter

public ActionResult Edit(long id) 
{ 
     return View(modelBuilder.BuildModel(personService.Get(id))); 
} 

[HttpPost] 
public ActionResult Edit(PersonViewModel model) 
{ 
    if (!ModelState.IsValid) 
     return View(modelBuilder.RebuildModel(model));  
     personService.Save(modelBuilder.BuildEntity(model)); 
     return RedirectToAction("Index"); 
} 

ValueInjecter의 빠른 데모를 볼 수 있습니다

//build viewmodel 
    personViewModel.InjectFrom(person) 
        .InjectFrom<CountryToLookup>(person); 

//build entity 
    person.InjectFrom(personViewModel) 
      .InjectFrom<LookupToCountry>(personViewModel); 
+0

무엇이 있습니까? Bogards AutoMapper의 주요 차이점은 무엇입니까? – Martin

+0

Automapper를 사용하여 @Martin 객체 매핑의 가능한 각 쌍에 대한 매핑을 만들고 각 속성을 부분적으로 매핑하는 방법을 보여 주어야합니다 (이름이 같지 않은 경우). 사용자가 ' ValueInjecter를 사용하면 ValueInjecter를 사용하여 ValueInjecter를 사용하여 값을 설정하는 알고리즘을 사용하여 한 유형에서 다른 유형으로 평탄화 및 평탄화를 수행 할 수 있습니다. 다운로드 – Omu