2011-01-28 2 views
3

이 프레임 워크가 유쾌하게 필요한 것의 95 %를 어떻게 수행하는지에 대한 이야기지만, 그 마지막 5 %에서는 부끄럽지 않게 싫어합니다. 비표준 말라 키에 참여하기를 원하면 자신의 사업이라고 고맙습니다. 좋은 일을하는 것으로 돌아가고 싶다고 결정하면 여기에 올거예요. 일반적으로 말하자면이 최종 5 퍼센트에는 필수 기능의 일부 버전이 포함될 수밖에 없습니다.ASP.Net MVC 2 : viewmodel을 사용하면 모델 바인딩이 손상됩니다.

데이터 개체를 업데이트하는 강력한 형식의보기가 있습니다. 관용적 인 MVC2 헬퍼를 사용했습니다. 예를 들어 Html.TextBoxFor(model = > model.Name)입니다. 중첩 된 객체에 Editor 템플릿을 사용했습니다. (백엔드는 Mongo 문서 모음이므로 복잡한 유형을 나타낼 필요가 있습니다.)

그럼 드롭 다운이 필요합니다. 드롭 다운은 조금 까다 롭습니다. 문제는, 내가 대신 직접 item에 전달하는 뷰 모델을 만들 거 야 : 잘 작동

class itemViewModel 
{ 
    ... 
    public Item item { get; set; } 
    public IEnumerable<SelectListItem> dropdown { get; set; } 
} 

public ActionResult() 
{ 
    return View("Update", new itemViewModel(item, dropdown)) 
} 

은 ... 드롭 다운을 채 웁니다. 그러나! 내 전망을 업데이트해야합니다 :

Html.TextBoxFor(model => model.Name) -> 
Html.TextBoxFor(model => model.item.Name) 

위대한, 문제 해결. 죄송합니다. 이제 모델 바인딩이 작동하지 않습니다. 디버그하고 Request.Form 값을 살펴보십시오. 오. Name 대신 item.Name입니다. 말이된다. 대신 업데이트보기에 itemViewModel이 필요하다고 말하면 바인딩이 작동합니다.

아, 기다리지 마세요. 편집자를 사용하는 중첩 된 객체가 있기 때문입니다. 그들은 유형이 강하고 수신중인 모델이 실제로 뷰 모델의 속성이라는 것을 모릅니다. 따라서 그들은 여전히 ​​item.Address.City 대신 Address.City을 뱉어 내고 바인딩에 실패합니다.

내가 몇 가지 해결 방법을 생각할 수

:

  1. 는 그것이 속성
  2. 의 몰라도 item 모델을 얻을 수 있도록
  3. 은 자체 입력 된 편집기로 전체 빌어 먹을 양식을 넣어 전문 사용자 정의 모델 바인더를 작성

    보기 모델을 죽이고 사전을 사용하여 드롭 다운을 해킹하십시오.
  4. HtmlHelpers을 사용하여 종료하고 전체 양식을 직접 입력하십시오.
  5. 램버스 모델 개체를 매개 변수로 사용하여 내 HtmlHelper 확장명을 작성하십시오.
  6. 모든 라벨/필드 그룹을 개별 편집기 템플릿에 넣습니다.

이 모든 것은 과도하거나 슬프다. 뷰 모델은 깨끗하고 유용한 방법 인 것 같습니다. 그 (것)들을 사용하여 나가 다른 지역에서 거칠거나 프레임 워크의 꽤 큰 덩어리에 작은 변이를 재생해야 한 ㄴ다는 것을 의미 하는가? 나는 지난 3 개월 동안 C#을 배웠다. (그래픽 디자이너는 CS 배경이없는 정적 인 타이핑이 무엇인지 알고 싶어했다. 나는 고립되어 일한다. 최고의 사례를 배울 수있는 사람이 없습니다. 나는 그들 중 일부를 배우지 않으면 나는 유지할 수없는 똥 더미로 끝날 것 같은 기분이 든다. 따라서 귀하의 의견은 높이 평가됩니다.

답변

8

한숨.몇 가지 인터넷 검색보다 시간 어둠 속에서 몇 장면, 그리고 믿을 수 없을 정도로 간단 식으로 Bind 속성을 사용하여이 작업을 수행하는이 나타납니다 :

[HttpPost] 
public ActionResult([Bind(Prefix="item")] item) 
{ 
    //item's complex types populate correctly 
} 

속성은에 도달 할만큼 똑똑 것 같다을 복합 형.

나는 이것을 내 자신의 무지에 대한 찬사로 남겨두고, 다른 어떤 불운 한 n00b가 내가 한 것보다 더 빨리 답을 찾길 희망한다.

+0

Daniel! –

-9

Daniel, 먼저 여러분의 노력에 힘 입어 .NET, C# 및 ASP.NET MVC를 하나의 큰 물린 것으로 생각합니다. 좋아, 그래서 너는 좌절하고 나는 그것에 관련이있다. 지금은 우리 모두에게 일어나는 일입니다.

저는 ASP.NET MVC (Problems with ASP.NET MVC Framework Design)의 팬이 아니라는 사실을 알려 드리고 문제 해결에 도움이되지 않습니다. 그러나 여기에 나와있는 상황을보고 싶습니다.

당신은 미로에 있고 어딘가에서 잘못 돌아서 미로 속으로 깊숙이 들어갈 수 있습니다. 탈출구를 찾지 않을거야. 그래서 당신이해야 할 일은 잘못된 방향으로 되돌아 가서 다른 경로가 있는지 확인하는 것입니다. 그래서 당신이 어디에 있느냐에 따라, 왜 당신이 만든 모든 단계/변화에 대해 스스로에게 물어보고, 왜 한 번에 한 걸음 씩 물어야 하는지를 묻습니다. 말이 돼? 당신은 결국 같은 (원래의) 문제를 다루기위한 다른 대안적인 방법이있는 지점에 도달하게 될 것입니다.

+2

-1. 설교와 ASP.Net MVC의 부정적인면에 집중하면서 문제를 해결하는 데 도움이되지 않았습니다. – Pradeep

관련 문제