Mam stronę w MVC3 z modelem "pageModel".

Na tej stronie mam:

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

W moim kontrolerze wykonuję:

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

Strona ładuje się dobrze za pierwszym razem, ale kiedy ogłaszam zwrot w akcji httpPost, model.submodel jest zawsze null.

Moje pytanie brzmi, jak zwrócić zaktualizowany model z RenderPartial (jeśli w ogóle). Mogę umieścić mój model w części, ale nie z powrotem!

4
JustAnotherDeveloper 27 luty 2012, 18:13

3 odpowiedzi

Najlepsza odpowiedź

Problem z podszablonami polega na tym, że nie zachowują one kontekstu nawigacyjnego. Oznacza to, że wszelkie pola wejściowe, które mogłeś umieścić w tej części, będą miały nieprawidłowe nazwy, a domyślny spinacz modelu nie będzie w stanie odzyskać wartości podczas POST. Twój kod HTML będzie wyglądał tak:

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

Natomiast poprawne jest:

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

Aby uzyskać ten poprawny znacznik, polecam korzystanie z szablonów edytora.

Więc zastępujesz:

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

Z:

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

A następnie przenosisz podzespół _subPage.cshtml do ~/Views/Shared/EditorTemplates/SubModelType.cshtml, gdzie SubModelType jest typem właściwości subModel:

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

Teraz, gdy spojrzysz na wygenerowany kod HTML, odpowiednie nazwy pól wejściowych powinny być poprzedzone subModel, a wewnątrz akcji kontrolera POST właściwość model.subModel zostanie tym razem prawidłowo zainicjowana i wypełniona wartościami wprowadzonymi przez użytkownika w polach wejściowych.

12
Darin Dimitrov 27 luty 2012, 18:19

Musisz zmienić widok częściowy, aby zaakceptować model najwyższego poziomu, tj.:

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

Które następnie wyrenderują twoje właściwości w częściowym widoku z poprawnymi nazwami właściwości, np.:

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

Oznaczałoby to również, że zwrócony model w akcji HttpPost będzie musiał w nienaruszonym stanie poprawić relację nawigacyjną.

To tylko jedno z tych zastrzeżeń związanych z modelami widoków i hierarchiami. Och, btw, w mvc3 nie potrzebujesz gadatliwego [AcceptVerbs(HttpVerbs.Post)] dla postów. Możesz po prostu użyć [HttpPost]

1
jim tollan 27 luty 2012, 18:24

Możesz także wykonać następujące czynności.

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

Twój częściowy widok pozostanie bez zmian, używając @model SubModel

1
SajidQ 18 listopad 2013, 20:52