이 질문에 대한 대답은 개체가 양식의 POST 데이터로 재구성된다는 것입니다. 이것은 상당히 기본이지만, MVC는 발생하는 상황을 너무 많이 숨겨서 MVC 베어링을 얻으 려 할 때 보지 못합니다. 항목의 순서
이다
- 필요한 모든 필드 형태를 만들고; 비 표시 키 (ID)에 대해 숨겨진 필드를 사용하십시오.
- 사용자는 웹 페이지와 상호 작용합니다. 양식 제출 버튼을 누릅니다.
- 모든 필드 데이터가 컨트롤러 페이지에 게시됩니다.
- MVC는 클래스 개체로 데이터를 다시 구성합니다.
- 제어기 페이지는 다시 구성된 클래스 인스턴스를 형식 매개 변수로 사용하여 호출됩니다.
주 :
페이지를 만들기 형태는 오브젝트의 각 부분을위한 필드를 생성이 표시된다. 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의 목록을 다시 구성이 실패합니다 생성자의 목록에 대한 유효한 컨테이너를 만들어 주목하는 것이 중요하다. 무대 뒤에서 많은 일들이 일어나고 있지만, 모두 추적 가능합니다.
두 가지 중요한 점은이에 문제가있는 경우 :
- 당신이 서버에 다시 여행을 "생존"필요 모두를위한
@Html.HiddenFor(...)
있는지 확인합니다.
- Fiddler 또는 HTTPLiveHeaders (Firefox 플러그인)를 사용하여 POST 데이터의 내용을 검사하십시오. 이렇게하면 새 클래스 인스턴스를 다시 구성하기 위해 어떤 데이터가 다시 전송되는지 확인할 수 있습니다. 나는 어떤 브라우저에서나 사용할 수 있기 때문에 Fiddler에게는 부분적이다 (그리고 폼 데이터를 잘 보여준다).
마지막 포인트 : 동적으로 추가/MVC와 목록에서 요소를 제거에 좋은 기사가 : http://jarrettmeyer.com/post/2995732471/nested-collection-models-in-asp-net-mvc-3 그것은을 통해 일하기 좋은 기사 - 그리고 네,이 MVC3 및 면도기와 함께 작동 않습니다.
실제로 사람을 편집하지 않으므로 작성중인 사람이 아닙니까? –
수정. 사람을 편집 할 때 Model 객체가 이미 있습니다. 사람을 만들 때 모델 객체는 null입니다. –