2011-05-13 2 views
1

나는 이것에 대해 약간의 연구를 해왔지만 모델 바인딩이 MVC 3에서 필요하면 이해하는데 약간의 문제가 있습니다. Create View에 데이터를 제공하기 위해 ViewModel을 만들었습니다.내 행동 만들기에 맞춤형 모델 바인더가 필요합니까?

public class InvitationRequestViewModel 
{ 
    public InvitationRequest InvitationRequest { get; private set; } 

    public IEnumerable<SelectListItem> EventsList { get; private set; } 

    public string EventId { get; set; } 

    public InvitationRequestViewModel(InvitationRequest request) 
    { 
     InvitationRequest = request; 
     EventsList = new SelectList(MyRepositoryAndFactory.Instance.FindAllEvents() 
       .Select(events => new SelectListItem 
       { 
        Value = events.ID.ToString(), 
        Text = String.Format("{0} - {1} - {2}", events.Name, events.Location, events.StartDate.ToShortDateString()) 
       } 
      ), "Value", "Text"); 
    } 
} 

내 InvitationRequest 컨트롤러 내가 더 문제보기를 만들기 도달 할 수있는 다음과 같은 작업 방법

public ActionResult Create() 
    { 
     InvitationRequest request = new InvitationRequest(User.Identity.Name); 

     return View(new InvitationRequestViewModel(request)); 
    } 

    [HttpPost] 
    public ActionResult Create(InvitationRequestViewModel newInvitationRequest) 
    { 
     try 
     { 
      if (!ModelState.IsValid) return View(newInvitationRequest); 

      newInvitationRequest.InvitationRequest.Save(); 
      MyRepositoryAndFactory.Instance.CommitTransaction(); 
      return RedirectToAction("Index"); 
     } 
     catch 
     { 
      ModelState.AddModelError("","Invitation Request could not be created"); 
     } 

     return View(newInvitationRequest); 
    } 

을 가지고 있으며 DDL 사용 가능한 이벤트 목록으로 채워집니다. 내 문제는 InvitationRequestViewModel이 HttpPost Create 메서드에 매핑 될 것으로 예상했기 때문입니다. 대신 "웹 사이트에서 페이지를 표시 할 수 없습니다."라는 오류 메시지가 나타납니다. 서명을 사용할 때 :

public ActionResult Create(FormCollection collection){ } 

게시 된 값을 볼 수 있습니다. 컨트롤러에서 자체 매핑 코드를 수행하지 않기를 바랬습니다.
사용자 정의 ModelBinder가 대답입니까? 내가 형 InvitationRequestViewModel의 강력한 형식의보기를 사용하고이가 DDL 코드

<div class="editor-label"> 
     @Html.LabelFor(model => model.InvitationRequest.Event) 
    </div> 
    <div class="editor-field"> 
     @Html.DropDownListFor(x => x.EventId, Model.EventsList) 
    </div> 

답변

1

입니다

편집 당신은 너무 기본 모델 바인더가 인스턴스화 할 수있는 InvitationRequestViewModel에 대한 매개 변수가없는 생성자를 지정해야합니다.