MVC3 - вернуть модель из RenderPartial - PullRequest
4 голосов
/ 27 февраля 2012

У меня есть страница в MVC3 с моделью "pageModel".

На этой странице у меня есть:

@{ Html.RenderPartial("_subPage", Model.subModel); } (Pagemodel.submodel)

В моем контроллере я делаю:

 [Authorize]
 [AcceptVerbs(HttpVerbs.Post)]
 public ActionResult Results(pagemodel model, string frmAction)
 {
 }

Страница загружается нормально с первого раза, но когда я выполняю обратную передачу в действие httpPost, model.submodel всегда равно нулю.

Мой вопрос: как мне вернуть обновленную модель из RenderPartial?(если вообще).Я могу получить свою модель в частичную, но не обратно!

Ответы [ 3 ]

12 голосов
/ 27 февраля 2012

Проблема с частями заключается в том, что они не сохраняют навигационный контекст.Это означает, что любые поля ввода, которые вы могли бы поместить в этот фрагмент, будут иметь неправильные имена, и механизм связывания модели по умолчанию не сможет получить значения обратно при выполнении POST.Ваш HTML будет выглядеть следующим образом:

<input type="text" name="Prop1" value="property 1 value" />
<input type="text" name="Prop2" value="property 2 value" />

, тогда как правильный:

<input type="text" name="subModel.Prop1" value="property 1 value" />
<input type="text" name="subModel.Prop2" value="property 2 value" />

Чтобы добиться правильной разметки, я бы рекомендовал вам использовать шаблоны редактора.

Таким образом, вы заменяете:

@{ Html.RenderPartial("_subPage", Model.subModel); }

на:

@Html.EditorFor(x => x.subModel)

, а затем вы перемещаете ваш _subPage.cshtml частичный в ~/Views/Shared/EditorTemplates/SubModelType.cshtml, где SubModelType является типом subModelсвойство:

@model SubModelType
@Html.EditorFor(x => x.Prop1)
@Html.EditorFor(x => x.Prop2)

Теперь, когда вы посмотрите на сгенерированный HTML, соответствующие имена полей ввода должны начинаться с префикса subModel, а внутри действия контроллера POST свойство model.subModel на этот раз будет правильно инициализировано и заполнено.из значений, введенных пользователем в поля ввода.

1 голос
/ 18 ноября 2013

Вы также можете выполнить следующее.

@Html.RenderPartial(
    "_subPage",
    Model.subModel,
    new ViewDataDictionary
    {
        TemplateInfo = new TemplateInfo
        {
            HtmlFieldPrefix = "subModel"
        }
    });

Ваш частичный вид останется без изменений, используя @model SubModel

1 голос
/ 27 февраля 2012

вам нужно изменить частичное представление, чтобы оно принимало модель верхнего уровня, например:

@{ Html.RenderPartial("_subPage", Model); } 

, которая затем отображает ваши свойства в частичном представлении с правильными именами свойств, например:

<input type="text" name="subModel.MyProperty" value="somevalue" />

Это также означает, что ваша возвращенная модель в действии HttpPost должна исправить нетронутые навигационные отношения.

это только одно из предостережений, связанных с моделями представления и иерархиями.,О, кстати, в mvc3 вам не нужен подробный [AcceptVerbs(HttpVerbs.Post)] для постов.Вы можете просто использовать [HttpPost]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...