MVC4 - Teilansicht-Modell verbindlich, während Übermitteln
Ich habe ein view-Modell, das hat ein anderes Kind-Modell zum Rendern der Teilansicht (unten).
public class ExamResultsFormViewModel
{
public PreliminaryInformationViewModel PreliminaryInformation { get; set; }
public string MemberID { get; set; }
public string MemberName { get; set; }
public int PatientID { get; set; }
public string ConfirmationID { get; set; }
public bool IsEditable { get; set; }
#region Select Lists
public SelectList ProviderOptions { get; set; }
#endregion
}
public class PreliminaryInformationViewModel
{
public string ProviderName { get; set; }
public string ProviderID { get; set; }
public string ServiceLocation { get; set; }
}
Diese PreliminaryInformationViewModel view-model-auch als Kind-Modelle in einem anderen view-Modell, da diese vorläufigen Informationen, die aktualisiert werden können, auf verschiedenen Seiten.
So, ich habe diesen vorläufigen Informationen als separate Teil-und zum einbinden in andere Seiten.
@{Html.RenderPartial("_PreliminaryInformation", Model.PreliminaryInformation);}
Innerhalb der teilweise
@model Web.Models.Preliminary.PreliminaryInformationViewModel
<div>
@Html.TextBoxFor(x => x.DateOfService })
</div>
Aber das problem ist bei Vorlage dieses vorläufige Modell ist immer null, aus dem Grund HTML name-Attribut wird immer gerendert
aber wenn ich den pass der Eltern Modell für die teilweise, wie unten beschrieben.
@model Web.Models.Exam.ExamResultsFormViewModel
<div>
@Html.TextBoxFor(x => x.PreliminaryInformation.DateOfService })
</div>
Nun das HTML-element generiert wird, als
<input type = 'text' name='PreliminaryInformation.DateOfService.DateOfService' id='PreliminaryInformation.DateOfService'>
und bindet es richtig während die reichen.
Ich verstehe MVC binden Sie den Wert des Elements basierend auf dem name-Attribut-Wert, aber die zweite Umsetzung brauchen würde, mir das erstellen von mehreren teilweise für jede Seite, die ich nicht mag.
Bisher konnte ich keine Lösung finden, mit der ersten Umsetzung, ist es Weg, ich kann machen, vorläufig Informationen, Modell-Wert binden beim senden mit der ersten Umsetzung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich weiß, das ist ein bisschen spät aber es hilft vielleicht jemand
Wenn Sie mit komplexen Modell, können Sie immer noch passieren in partielle Verwendung:
wo ich das so definierte Modell mit der Eigenschaft "Kontakt". Nun, was HtmlFieldPrefix tun ist, fügen Sie die Eigenschaft verbindlich für jedes Modell ", so der binder Modell finden können, das übergeordnete Modell"
Es ist ein blog-post darüber: http://www.cpodesign.com/blog/bind-partial-view-model-binding-during-submit/
.NET-Core-2-Bindung
In .NET-Core-2 und MVC die Antwort oben nicht funktioniert, die Eigenschaft ist nicht mehr einstellbar.
Wie auch immer, die Lösung ist sehr ähnlich.
danach können Sie Ihr Modell einzureichen, bindet es sich wieder.
Hoffe, das hilft
Benötigen Sie ein editor-Vorlage für
PreliminaryInformationViewModel
zu ersetzen, die dem partial view, dann rufen Sie mitHtml.EditorFor( m => m.PreliminaryInformation )
. Referenz diese Lösung. Das erstellen der Vorlage sollte so einfach wie das verschieben Ihrer teilweise Sicht auf die " Views/Shared/EditorTemplates-Verzeichnis.Html.EditorFor(...)
wird automatisch diese Vorlage verwenden, basierend auf dem Typ, den Sie übergeben, wie das Modell (in diesem FallPreliminaryInformationViewModel
)Html.EditorFor(...)
sollten automatisch wählen Sie diese Ansicht für die editor-template basierend auf dem Typ sind Sie vorbei als ModellKönnen Sie die HtmlFieldPrefix an die Spitze der Teilansicht:
Dies ist der gleiche Ansatz wie beschrieben von @cpoDesign aber es bedeutet, Sie können halten Sie das Präfix in deinem partial Ansicht, wenn Sie brauchen, um zu tun.
Ich lief auch dieses problem. Ich werde erklären, meine Lösung, die mit Ihrem code. Ich begann mit diesem:
Die Aktion entsprechend dem http-post-war auf der Suche für das übergeordnete Modell. Der http-post-war dem Absenden des Formulars korrekt, aber es war keine Referenz in das Kind teilweise zu den Eltern teilweise. Die eingereichten Werte vom Kind teilweise ignoriert wurden und die entsprechende Kind-Eigenschaft blieb null.
Ich ein interface geschaffen, IPreliminaryInfoCapable, enthielt eine definition für das Kind geben, etwa so:
Machte ich meine Eltern Modell diese Schnittstelle implementieren. Meine partielle view verwendet dann die Schnittstelle am besten als Modell:
Schließlich, meine Eltern anzeigen können, verwenden Sie den folgenden code zu übergeben, sich um das Kind teilweise:
Dann das Kind nur teilweise benutzen Sie das untergeordnete Objekt, etwa so:
Alle diese richtig füllt das übergeordnete Modell auf http-post an die entsprechende Aktion.
Quick-Tipp: beim aufrufen des "EditorFor" - Methode, können Sie den Namen der Vorlage als parameter von Html."EditorFor" - Methode. Alternativ Namenskonventionen kann dein Freund sein; so stellen Sie sicher, dass Ihr editor-template mit dem Namen genau den gleichen Namen wie die Eigenschaft model Typ
d.h. die Eigenschaft model Typ 'CustomerViewModel' => 'CustomerViewModel.cshtml' editor-template.
Bitte machen Sie die nachstehenden änderungen Ihrer teilweise Seite. so wird es kommen, mit Ihren Eltern Modell
Für .net-core-2 und mvc verwenden zu tun, wie unten: