새 개체를 만드는 경우 뷰 모델을 사용하는 가장 좋은 방법을 찾으려고합니다.ASP.NET MVC 3 뷰 모델 패턴
연락처 개체와 일부 회사 목록이 포함 된 매우 간단한보기 모델이 있습니다.
private ICompanyService _Service;
public SelectList ContactCompanyList { get; private set; }
public Contact contact { get; private set; }
public ContactCompanyViewModel(Contact _Contact)
{
_Service = new CompanyService();
contact = _Contact;
ContactCompanyList = GetCompanyList();
}
private SelectList GetCompanyList()
{
IEnumerable<Company> _CompanyList = _Service.GetAll();
return new SelectList(_CompanyList, "id", "name");
}
그런 다음이 뷰 모델을 사용하는 연락처 컨트롤러가있어서 내 연락처에 관련된 회사를 선택할 수 있습니다.
[Authorize]
public ActionResult Create()
{
return View(new ContactCompanyViewModel(new Contact()));
}
제 문제는 컨트롤러의 create 메소드 때문입니다.
[Authorize]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(Contact _Contact)
{
try
{
_Service.Save(_Contact);
return RedirectToAction("Index");
}
catch
{
return View();
}
}
문제는보기가 빈 연락처 객체를 반환한다는 것입니다. 드롭 다운 목록에 명시 적으로 필드 이름이 선언되어 있기 때문에 회사 ID가 채워집니다. HTML.EditorFor
도우미를 사용하는 경우
@Html.DropDownList("parent_company_id",Model.ContactCompanyList)
표준 HTML 양식 필드는 내가 만드는 행동으로 FormCollection
를 사용하는 경우
@Html.EditorFor(model => model.contact.forename)
내가 그들에 액세스 할 수 있습니다 ... contact.forename
의 형식에서 객체 값을 전달 메서드 paremeter 및 명시 적으로 contact.value
검색하지만 연락처 개체를 매끄럽게 내 코드를 유지하고 매번 새 연락처 개체를 빌드 할 필요가 없습니다 매개 변수로 사용할 수 없습니다.
실제 뷰 모델 객체를 매개 변수로 전달하려고 시도했지만 생성자 오류가 발생합니다 (보기가 연락처 객체가 아닌보기 모델에 바인딩 될 때보기가 혼란 스럽습니다).
Html.EditFor
필드의 이름을 정의하여 내 컨트롤러에서 동작 만들기 메서드로 다시 전달할 때 값이 올바르게 연락처 개체에 매핑되도록하는 방법이 있습니까? 또는 어딘가에서 FUBAR 실수를 한 적이 있습니까? (이것이 학습 연습이므로 가장 가능성있는 설명입니다!)
고마워요. 제가보기 모드를 만들기 작업 방법에 매핑 할 수있게하여 문제를 해결했습니다. 드롭 다운 값이 바인딩되지 않은 유일한 문제는 드롭 다운 이름을 변경하여 해결했습니다. ~ ** @ Html.DropDownList ("contact.parent_company_id", Model.ContactCompanyList).** 내 유일한 질문은 수동으로 매핑하는 이유입니다. 채워진 연락처 객체를 포함하는 모델이 있습니다. 매핑 할 것이 없습니다. –
@DavidAbraham, 프로세스를 설명하기 위해 수동으로 매핑했습니다. 실제 응용 프로그램에서는 AutoMapper를 사용합니다. http://automapper.org/이 작업을 수행합니다. –
그러나 다시 Automapper가 필요하지 않습니다. 제 경우에는 이제 완전히 채워지는 연락처 도메인 객체를 포함하는 viewmodel 객체를 다시 전달했습니다. 매핑 할 것이 없습니다. 자동 매퍼는 어디에 있습니까? –