Вместо использования Html.RenderPartial()
поместите частичное представление в Shared / EditorTemplates / и назовите его именем типа (в данном случае ZipCodeViewModel
). Затем вы можете использовать Html.EditorFor()
, передавая выражение для свойства. EditorFor () правильно ставит префиксы в поля, чтобы связыватель модели в MVC мог правильно разместить ваши данные.
Так что-то вроде этого
@model UserViewModel
.....
@Html.EditorFor(m => m.ZipCode);
Я попытаюсь найти некоторые ссылки и ресурсы, но хотел бы получить ответ для вас.
EDIT :
Кажется, что в этом блоге рассматриваются основы расширения EditorFor () и EditorTempaltes: Советы по работе с ASP.NET MVC: Tempaltes редактора
В любом случае, когда вы используете эти расширения Html.TextBoxFor()
или Html.DropDownFor()
, они получают полное имя свойства из выражения, которое вы передаете, и задаете для него атрибуты name и id входного элемента HTML. Примером может быть:
@Html.TextBoxFor(m => m.Person.FirstName)
будет отображать
<input id="Person_FirstName" name="Person.FirstName" type="text" value="<what ever was in FirstName>" />
Эти входные имена и значения являются парами ключ / значение в данных поста. Механизм связывания моделей ASP.NET MVC по умолчанию пытается сопоставить эти ключи с моделями, в которых используются действия вашего контроллера. Если он может найти совпадение, он устанавливает значение.
Таким образом, ваша проблема выше, возможно, связана с тем, что входные имена в вашем частичном представлении идут от ZipCodeViewModel
вниз, но ваше действие принимает UserViewModel
. EditorFor()
ставит перед вами префиксы имен, так что он может в основном отображать частичное представление, которое отправит данные обратно, которые могут быть связаны для вас. Хотя вы можете сами установить атрибуты имени для элементов ввода (или сгладить все, как вы предлагали в комментариях), эти помощники помогут вам сделать это.
Надеюсь, это поможет объяснить, что происходит, и возможное решение для вас.