2011-05-12 4 views
0

중첩 된 뷰 모델 (ChildViewModel)을 사용하여 viewmodel (MasterViewModel)을 가지고 있고 jQuery를 통해 ajax 게시를 수행하는 양식 내에 dropdownlist가 있습니다. 부분보기. 하지만 내가하는 일과 관계없이, Part 액션의 childview 모델은 항상 비어 있습니다. 그 이유를 이해하지 못합니다. Heres는 간단한 코드 예제 :html.beginform에서 중첩 된 viewmodel을 전달합니다.

컨트롤러 :

Namespace MvcApplication2 
    Public Class TestController 
     Inherits System.Web.Mvc.Controller 

     ' 
     ' GET: /Test 

     Function Index() As ActionResult 
      Dim viewModel As New MasterViewModel 
      viewModel.MyId = 123 
      viewModel.ChildViewModel = New ChildViewModel With {.Name = "woohoo"} 
      viewModel.Items = New List(Of SelectListItem) From { _ 
       New SelectListItem With {.Text = "first", .Value = "1"}, 
       New SelectListItem With {.Text = "second", .Value = "2"} 
      } 
      viewModel.SelectedItem = New List(Of SelectListItem) From { _ 
       New SelectListItem With {.Text = "first", .Value = "1"} 
      } 
      Return View(viewModel) 
     End Function 

     Function Part(ByVal viewModel As ChildViewModel) As ActionResult 
      viewModel.Name = viewModel.Name & "_" 
      Return PartialView(viewModel) 
     End Function 


    End Class 
End Namespace 

색인보기 :

@ModelType MvcApplication2.MasterViewModel 
@Code 
    ViewData("Title") = "Index" 
End Code 
<script type="text/javascript" language="javascript"> 
    function update() { 
     $('#myForm').change(function() { 
      var form = $('#myForm'); 
      $.ajax({ 
       url: form.attr('action'), 
       type: form.attr('method'), 
       data: form.serialize(), 
       success: function (result) { 
        $('#mjoo').html(result); 
       } 
      }); 
     }); 
    } 

</script> 
<h2>Index</h2> 

<p>@Model.MyId</p> 

@Using Html.BeginForm("Part", "Test", FormMethod.Post, New With {.id = "myForm"}) 

    @Html.DropDownListFor(Function(x) x.SelectedItem, Model.Items, New With {.onchange = "update()"}) 
    @Html.HiddenFor(Function(x) x.ChildViewModel) 

End Using 

<div id="mjoo"> 

    @Html.Partial("Part", Model.ChildViewModel) 

</div> 

부품보기 :

@ModelType MvcApplication2.ChildViewModel 

<p>@Model.Name</p> 

Viewmodels :

Public Class MasterViewModel 
    Property ChildViewModel As ChildViewModel 
    Property Items As List(Of SelectListItem) 
    Property SelectedItem As List(Of SelectListItem) 
    Property MyId As Integer 
End Class 

Public Class ChildViewModel 
    Property Name As String 
End Class 

무엇이 잘못되었을 수 있습니다. 나는 실종 된 것이 있다는 것을 알고 있지만 나는 그것을 볼 수 없다.

답변

0

마술처럼 전체 모델을 단일 필드에 채울 수는 없습니다.
모델의 각 속성에 대해 별도의 숨김 필드를 만들어야합니다.

코드를 단순화하기 위해 하위 모델을 사용하는 별도의 부분보기로 전체 양식을 이동하는 것이 좋습니다.

+0

좋아요, 훨씬 좋습니다. 목록에있는 속성에 여전히 문제가 있습니까? – MowgliMango

+0

Btw, 나는 15 명의 담당자가있을 때까지 대답을 upvote 할 수는 없지만 다시 올 것이다. – MowgliMango

+0

@Mowgli : 목록을 HTTP POST의 컨트롤러로 다시 전달하는 대신 데이터베이스에서 가져 오는 것이 좋습니다. 그렇지 않은 경우 http://blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list-aspnet-mvc-2-style/을 참조하십시오. – SLaks