2011-05-14 2 views
1

: 나는 "사람"을 편집 할 수있는 전망이모델 객체가 MVC3 (ASP.NET)에서 생성 될 경우 모델 객체가 MVC3에서 인스턴스화 할 때 이해하려고 노력

; 각 사람은 여러 주소를 가질 수 있습니다. Person View의 그리드에 주소를 표시하고 있습니다.

사람을 표시 할 때 유용합니다. Person.Addresses을 반복하고 테이블/그리드를 빌드하는 부분 뷰가 있습니다.

새 사람을 만들 때 person 개체가 null이고 Person.Addresses 참조가 잘못된 경우 문제가 발생합니다.

MVC가 "저장"시 새로운 인스 턴스 인스턴스를 생성 할 것이므로 매우 근본적으로 뭔가를 놓치고 있다고 확신합니다. 그것은 내 자신의 객체 인스턴스를 시도하고 생성하기위한 반 생산물로 보일 것입니다. 만약 그렇다면, 그것을 폼의 나머지 엔트리 값에 어떻게 연결시킬지는 불분명합니다.

하나의 마지막 합병증 : Addresses의 목록은 선택 사항입니다. 주소가 전혀없는 것은 매우 합법적입니다.

관계형 데이터는 매우 일반적이므로이를 처리하기위한 더 간단한 솔루션이 있어야합니다. 모든 설명이 감사하겠습니다! 내가 믿고있어

+0

실제로 사람을 편집하지 않으므로 작성중인 사람이 아닙니까? –

+0

수정. 사람을 편집 할 때 Model 객체가 이미 있습니다. 사람을 만들 때 모델 객체는 null입니다. –

답변

3

이 질문에 대한 대답은 개체가 양식의 POST 데이터로 재구성된다는 것입니다. 이것은 상당히 기본이지만, MVC는 발생하는 상황을 너무 많이 숨겨서 MVC 베어링을 얻으 려 할 때 보지 못합니다. 항목의 순서

이다

  1. 필요한 모든 필드 형태를 만들고; 비 표시 키 (ID)에 대해 숨겨진 필드를 사용하십시오.
  2. 사용자는 웹 페이지와 상호 작용합니다. 양식 제출 버튼을 누릅니다.
  3. 모든 필드 데이터가 컨트롤러 페이지에 게시됩니다.
  4. MVC는 클래스 개체로 데이터를 다시 구성합니다.
  5. 제어기 페이지는 다시 구성된 클래스 인스턴스를 형식 매개 변수로 사용하여 호출됩니다.

주 :

페이지를 만들기 형태는 오브젝트의 각 부분을위한 필드를 생성이 표시된다. MVC는 유효성 검사 규칙뿐만 아니라 ID 및 기타 표시되지 않은 데이터에 숨겨진 필드를 사용합니다.

// Edit.cshtml 
@model Person 

@Html.Partial("_CreateOrEdit", Model) 

// _CreateOrEdit.cshtml 
@model Person 

@Html.HiddenFor(model => model.PersonID) 

@Html.LabelFor(model => model.first_name, "First Name") 
@Html.EditorFor(model => model.first_name) 

@Html.LabelFor(model => model.last_name, "Last Name") 
@Html.EditorFor(model => model.last_name) 

@Html.LabelFor(model => model.favorite_color, "Favorite Color") 
@Html.EditorFor(model => model.favorite_color) 

//etcetera 

또는 클래스 템플릿을 사용하여

(템플릿해야합니다
IT는 _CreateOrEdit.cshtml 페이지의 모든 개체 속성을 나열하여 양식이 중 하나 (일반적으로) 생성되는 것을 주목할 필요가있다 그들이 대표하는 클래스와 동일한 이름을 가지며 이들은 Views\Shared\EditorTemplates 폴더에 있습니다. 템플릿 페이지를 사용

은 이전 방법과 거의 동일합니다 :

// Edit.cshtml 
@model Person 

@Html.EditorForModel() 

및 템플릿 방법을 사용

// Shared\EditorTemplates\Person.cshtml 
@model Person 

@Html.HiddenFor(model => model.PersonID) 

@Html.LabelFor(model => model.first_name, "First Name") 
@Html.EditorFor(model => model.first_name) 

@Html.LabelFor(model => model.last_name, "Last Name") 
@Html.EditorFor(model => model.last_name) 

@Html.LabelFor(model => model.favorite_color, "Favorite Color") 
@Html.EditorFor(model => model.favorite_color) 

//etcetera 

쉽게 폼 (객체) 목록을 추가 할 수 있습니다. Person.cshtml가된다 :

// Shared\EditorTemplates\Person.cshtml 
@model Person 

@Html.HiddenFor(model => model.PersonID) 

@Html.LabelFor(model => model.first_name, "First Name") 
@Html.EditorFor(model => model.first_name) 

@Html.LabelFor(model => model.last_name, "Last Name") 
@Html.EditorFor(model => model.last_name) 

@Html.LabelFor(model => model.favorite_color, "Favorite Color") 
@Html.EditorFor(model => model.favorite_color) 

@EditorFor(model => model.Addresses) 

//etcetera 

// Shared\EditorTemplates\Address.cshtml 
@model Address 
@Html.HiddenFor(model => model.AddressID) 

@Html.LabelFor(model => model.street, "Street") 
@Html.EditorFor(model => model.street) 

@Html.LabelFor(model => model.city, "City") 
@Html.EditorFor(model => model.city) 

//etcetera 
MVC는 목록의 각 주소에 대해 필요한만큼의 양식 항목을 작성 처리합니다

.

POST는 정확히 역으로 작동합니다. 모델 개체의 새 인스턴스가 만들어지고 기본 매개 변수가없는 생성자가 호출 된 다음 MVC가 각 필드를 채 웁니다. 목록은 @Html.EditorFor(model.List)의 직렬화 프로세스를 역전하여 채워집니다. 의 그것을 커버

public class Person 
{ 
    public List<Address> Addresses; 

    public Person() 
    { 
     // You always need to create this List object 
     Addresses = new List<Address>(); 
    } 

    ... 
} 

: 당신이해야한다는 특정 클래스가 다른 MVC의 목록을 다시 구성이 실패합니다 생성자의 목록에 대한 유효한 컨테이너를 만들어 주목하는 것이 중요하다. 무대 뒤에서 많은 일들이 일어나고 있지만, 모두 추적 가능합니다.

두 가지 중요한 점은이에 문제가있는 경우 :

  1. 당신이 서버에 다시 여행을 "생존"필요 모두를위한 @Html.HiddenFor(...) 있는지 확인합니다.
  2. Fiddler 또는 HTTPLiveHeaders (Firefox 플러그인)를 사용하여 POST 데이터의 내용을 검사하십시오. 이렇게하면 새 클래스 인스턴스를 다시 구성하기 위해 어떤 데이터가 다시 전송되는지 확인할 수 있습니다. 나는 어떤 브라우저에서나 사용할 수 있기 때문에 Fiddler에게는 부분적이다 (그리고 폼 데이터를 잘 보여준다).

마지막 포인트 : 동적으로 추가/MVC와 목록에서 요소를 제거에 좋은 기사가 : http://jarrettmeyer.com/post/2995732471/nested-collection-models-in-asp-net-mvc-3 그것은을 통해 일하기 좋은 기사 - 그리고 네,이 MVC3 및 면도기와 함께 작동 않습니다.

0

주소는 테이블에없는 실제 입력 요소와 가능성 단지 <TD> 정보 </TD >? 그렇다면 데이터가 서버에 다시 게시되지 않으므로 인스턴스화되지 않습니다. 이 데이터는 속성에 매핑 (이름순으로 매핑)되도록 다시 게시되는 요소로 만들어야합니다. 모델 바인더는 적절히 명명 된 게시 된 양식 (또는 쿼리 문자열) 요소를 찾을 수 있으면 개체를 인스턴스화하고 다시 게시 할 때 개체를 컨트롤러로 전달합니다.

+0

그래서 POST 데이터의 일부가 될 수 있도록 주소 테이블을 요소 목록에 연결 하시겠습니까? 그렇다면 어떻게 달성 할 수 있습니까? –

+0

@ 로버트 가장 쉬운 방법은 AJAXish를하는 것입니다. SO 시스템에 주석을다는 방법과 비슷합니다. 댓글 추가를 클릭하면 댓글이 AJAX를 통해 게시되고 div가 새 콘텐츠로 업데이트됩니다. 강력하게 형식화 된 부분 뷰를 사용하여이 작업을 수행 할 수 있습니다. – TheHurt

관련 문제