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!
3 odpowiedzi
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.
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]
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
Podobne pytania
Nowe pytania
asp.net-mvc-3
ASP.NET MVC 3 to trzecia główna wersja rozszerzenia Model-View-Controller do tworzenia aplikacji internetowych w środowisku .NET.