2013-02-10 2 views
0

내가 가지고있는 유효하지 않습니다에 대해 정의은 ICollection은 modelstate는 다음 뷰 모델 MVC4

public class CreateCardViewModel 
    { 
     [HiddenInput(DisplayValue = false)] 
     public int SetId { get; set; } 

     [Required] 
     public ICollection<Side> Sides { get; set; } 

     [Required] 
     [DataType(DataType.Date)] 
     public DateTime DateCreated { get; set; } 

     [Required] 
     public bool IsReady { get; set; } 

    } 

그리고 다음 작업 만들기 :

[HttpGet] 
     public ActionResult Create(int setId) 
     { 
      var model = new CreateCardViewModel(); 

      // attach card to current set 
      model.SetId = setId; 

      // create a new Side 
      var side = new Side() {Content = "Blank Side"}; 

      // Add this to the model's Collection 
      model.Sides = new Collection<Side> { side }; 

      return View(model); 
     } 

     [HttpPost] 
     public ActionResult Create(CreateCardViewModel viewModel) 
     { 
      if (ModelState.IsValid) 
      { 
       var set = _db.Sets.Single(s => s.SetId == viewModel.SetId); 
       var card = new Card {Sides = viewModel.Sides}; 

       set.Cards.Add(card); 

       _db.Save(); 
      } 
      return View(viewModel); 


     } 

내가 만들려고 새 카드 인 경우 viewModel의 Sides 속성이 null이므로 ModelState가 null로 표시됩니다. 초기 사이드가 모델과 함께 전달되지 않는 이유를 알아낼 수 없습니다.

내보기는 다음과 같습니다

<h2>Create</h2> 

@using (Html.BeginForm()) { 
    @Html.ValidationSummary(true) 

    <fieldset> 
     <legend>CreateCardViewModel</legend> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.SetId) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.SetId) 
      @Html.ValidationMessageFor(model => model.SetId) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.DateCreated) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.DateCreated) 
      @Html.ValidationMessageFor(model => model.DateCreated) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.IsReady) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.IsReady) 
      @Html.ValidationMessageFor(model => model.IsReady) 
     </div> 

     <p> 
      <input type="submit" value="Create" /> 
     </p> 
    </fieldset> 
} 
+0

보기가 어떻게 생겼습니까? –

+0

여기에 추가하겠습니다. – RobVious

답변

1

ViewModel의 Sides 속성에 바인딩 된 항목이보기에 없습니다. 해당 속성의 값을 보유 할 형식이 없으면 모델 바인딩이 발생할 때 null이됩니다. 어떻게 든 양식에 Side을 캡처해야합니다.이 속성에서 어떻게 추가/제거 하시겠습니까? 사용자 상호 작용을 통해 양식에서 수행해야합니까?

+0

감사합니다. 뷰 모델의 모든 속성이 뷰에서 바인딩되어야한다는 것을 알지 못했습니다. SetId가 있어야하지만 표시되지 않는 이유는 무엇입니까? 카드가 없으면 카드가 세트에 연결되지 않습니까? – RobVious

+0

보기에있는 것 같아 조금 지저분한. 외래 키를 처리하는 더 좋은 방법이 있습니까? – RobVious

+0

ViewModel은 기본 모델 개체와 동일한 도메인 연결을 따를 필요가 없습니다. 당신은 객체를 평평하게 만들 수 있으며 ViewModel이 표시하고 조작해야하는 모든 속성을 간단하게 유지할 수 있습니다. 그런 다음 실제로 도메인으로 다시 매핑 할 때 도메인 객체 그래프를 다시 채울 수 있습니다. 매핑중인 속성이 외래 키인 경우 모델 바인딩 중에 컨트롤러로 다시 전달되도록 'Html.Hidden'에 저장할 수 있습니다. – levelnis

0

시도 유형 ICollection<Side>의 생성에 두 번째 인수()를 추가하고 그에 전달 아무것도 얻을 수 있는지 확인합니다.

+0

그냥 시도해 보았습니다. 아무 것도 얻지 못했습니다. 보기가보기 모델을 승인하는 것처럼 보이지만보기 모델의 측면을 제어기로 다시 전달하지는 않습니다. – RobVious

+0

게시하기 전에 클라이언트가 보는 HTML 버전을 게시 할 수 있습니까? – Moo