Передайте вложенную модель представления в html.beginform. - PullRequest
0 голосов
/ 12 мая 2011

У меня проблема с тем, что у меня есть viewmodel (MasterViewModel) с вложенной viewmodel (ChildViewModel), и у меня есть выпадающий список в форме, которая делает запись ajax через jQuery для обновления частичного представления.Но что бы я ни делал, модель childview в действии Part всегда пуста, и я не понимаю почему.Вот упрощенный пример кода:

Контроллер:

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>

Модели просмотра:

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

Что может быть не так с этим.Я знаю, что я что-то упускаю, но я просто не вижу этого.

1 Ответ

0 голосов
/ 12 мая 2011

Вы не можете волшебным образом собрать всю модель в одно поле.
Вам необходимо создать отдельное скрытое поле для каждого свойства в модели.

Я рекомендую переместить всю форму в отдельное частичное представление, которое использует дочернюю модель для упрощения кода.

...