2016-01-13 2 views
0

Ниже мой взгляд, модельMVC: не в состоянии обратной передачи ViewModel к контроллеру

public class ModelA 
{ 
    public string name {get;set;} 
    public string age {get;set;} 
    public ModelB modelB {get;set;} 
} 

Вот частичный вид: _PartialView

@model ModelB 
@*Bind all the into control*@ 
@Html.EditorFor(model => model.Name1) 
@Html.EditorFor(model => model.Name2) 
@Html.EditorFor(model => model.Name3) 

Вот вид

@model ModelA 
using (Ajax.BeginForm("ActionName", "AreaName", new AjaxOptions() 
{ 
    HttpMethod = "POST", 
    InsertionMode = InsertionMode.Replace, 
    OnSuccess = "BusinessPartner", 
    OnFailure = "ErrorThrown" 

}, new { name = "My App", id = "My App" })) 
{ 
    @Html.EditorFor(model => model.name) 
    @Html.EditorFor(model => model.age) 
    @Html.Partial("_PartialView", Model.modelB) 
    <input type="submit" class="btn btn-primary tabSubmit tab1" id="tab1Next" value="Save and Proceed" /> 
} 

Когда я postback для контроллера, я могу получить значение в ModalA, но ModalB имеет значение null. Если я передам всю модель вместо Model.modelB в частичный вид, я могу получить все значение. Является ли это ожидаемым поведением для MVC? или мне нужна какая-либо конфигурация?

+0

где ваш код действия вашего контроллера? –

+0

, если вы используете частичный вид, подобный этому, тогда вы должны использовать оба режима просмотра в параметре acton, например. public ActionResult MyAction (ModelA modelA, ModelB modelB) –

ответ

2

Вы должны заменить

@Html.Partial("_PartialView", Model.modelB) 

с

@Html.EditorFor(m => m.modelB) 

и переименовывать неравнодушен к

/Views/Shared/EditorTemplates/ModelB.cshtml 

так, что сво EditorTemplate (обратите внимание на имя файла должно быть так же, как и имя класса). Вы также можете найти его в /Views/yourControllerName/EditorTemplates папке)

Кроме того, необходимо указать HtmlFieldPrefix, как за this answer

Обратите внимание, что если вы проверить HTML вы парциальное в настоящее время генерации, она будет включать в себя

<input name="Name1" ... /> 

тогда она должна быть

<input name="modelB.Name1" ... /> 

для того, чтобы привязать к вашей модели. Использование EditorTemplate вместо частичного генерирует правильные атрибуты name.

+0

Thx. Посмотрите также на альтернативное решение :) – WenHao

Смежные вопросы