2010-07-28 5 views
1

MVC 응용 프로그램에서 "모델 바인딩"을 사용하지 않았습니다. 즉, 작업 매개 변수 목록의 하나 이상의 클래스에 양식 입력을 "매핑"하지 않았습니다. 많은 장소에서 묘사 된 방식. 대신 각 양식 필드에 매개 변수를 보내거나 FormCollection을 사용합니다.MVC 모델 바인딩 혼동

나는 이것을 시도하고 싶다고 생각했지만 기본 전제에 대해 혼란 스럽다. ViewModel (컨트롤러에서 뷰로 이동)에 사용하는 "바인딩"(View에서 Controller로 이동)에 동일한 모델을 사용하는 것이 좋습니다. (각 뷰에 대해 별도의 ViewModel을 사용하는 강력한 형식의 뷰를 사용하고 있습니다.)

그러나 내 뷰의 요구 사항이 내 동작의 요구 사항과 상당히 다르다는 것을 알게되었습니다. 예를 들어보기에는 사용자가 선택할 수있는 여러 선택 목록 그러나 액션은 각 목록의 모든 옵션이 아니라 사용자가 선택한 항목을 알아야합니다.

양방향으로 동일한 클래스를 사용하는 것이 일반적입니다.

public class IntervieweeSelectLists 
{ 
    public SelectList intervieweesList { get; set; }    
    public ClientSelectLists districtFilterLists { get; set; } 
    public SchoolDisplayListInfo schoolListDisplay { get; set; } 
    public long selectedIntervieweeID { get; set; }    
    public string selectedIntervieweeName { get; set; }   
    public string selectedSiteID { get; set; }     
    public bool needsInterviewList { get; set; }     
    public bool needsClientSelectLists { get; set; }   
} 

(플러스가 몇 가지 방법 등이다)이 클래스는보기에서 필요로

,하지만하지 그것 모두는 다음과 같습니다 예를 들어

, 여기 내 뷰 모델 클래스 중 하나입니다 즉, intervieweesList, districtFilterLists, needsInterviewList 등

이 필요합니다. 제 질문은 다음과 같습니다. 사용자 정의 모델 바인더를 작성하여이 클래스를 바인드하면 전체 클래스를 다시 작성해야합니까? SelectLists를 포함한 모델 바인더, 내용 그 중 데이터베이스에서 왔을 때, 정말로 필요한 것은 사용자가 선택한 것입니다. 또는이 클래스의 기존 인스턴스에서 뷰의 모델 바인더로 전송 된 모든 값을 설정하겠습니까?

죄송합니다. 여기에 일관성이 없으면 ... 내 이해에서 뭔가 빠져 있습니다. 도움! :)

답변

1

모델 바인더에서 의미있는 속성 만 다시 작성합니다. 서버 측에서 어떤 에러가 발생하지 않는 한 속성 값을 사용하지 않으면 DB에서 SelectListItems를 채우는 것이 엄청난 오버 헤드가됩니다.이 경우 서버 측에서 전체 ViewModel을 다시 생성해야합니다. -보기를 표시합니다.

1

맞춤형 모델 바인더가 필요하지 않습니다. 컨트롤러 동작에서 IntervieweeSelectLists이 반환되면 소식에서 다시 전달 된 데이터에 해당 정보가 포함되지 않으므로 목록이 비어있게됩니다. 따라서 빈 목록을 사용하여 필요한 답을 가진 객체가 있습니다. 이제 무언가가 검증되지 않고 모든 목록을 다시 표시해야한다고 말하게하십시오. 컨트롤러 동작은이 모델이 표시 될 때를 알고 있으므로 모델을보기로 전달하기 전에 목록 만 채워야합니다. 모델을 뷰에 전달할 필요가 없으며 목록을 채울 필요가 없으므로 결과를 저장하면됩니다.

+0

글쎄, 사용자 정의 모델 바인더를 고려한 이유는 Action.IsValid가 null 인 경우에도 모든 필드가 null (또는 기본값)으로 돌아 왔다는 것입니다. 참된. 기본 모델 바인더가 알아낼 수없는 것처럼 보였습니다. 그러나 필자가 필드에 대한 올바른 명명 규칙을 따르지 않았을 수 있습니다. – Cynthia

+0

OK, 클래스의 내용과 일치하도록 HTML 필드 이름을 변경하려고 시도했을 때 값을 다시 얻고 있습니다 (진행!). 그러나 반환 된 필드 중 일부는 클래스의 하위 레벨에 묻혀 있습니다. 즉, 선택한 district 속성은 districtFilterLists 객체 내에 있습니다. 그걸 전혀 집어 내지는 못합니다 - districtFilterLists는 null입니다.따라서 사용자 정의 모델 빌더가 필요하거나 ViewModel 클래스를 대폭 변경해야한다고 생각합니다. 그러나 고마워, 나는 마침내 어딘가에 도착하고 있다고 느낀다. 전 동료가 없습니다. 저는 IT 부서 전체입니다. 그래서 아이디어를 떠내려하는 누군가가 필요했습니다. – Cynthia

+0

HTML을 직접 작성하는 것처럼 들립니다. DisplayFor 및 EditFor HTML 도우미를 사용하여 HTML을 작성해야합니다. 그러면 자동으로 이름이 만들어집니다. http://www.asp.net에서 ASP.Net MVC 데모를 확인하는 것이 좋습니다. (Model.IsValid는 유효성 검사 데이터 주석이 없으면 유효성 검사를 기본적으로 수행합니다. –