4 Stimmen

Wie man das korrekte Modellbindungsverhalten beibehält, wenn man eine Modell-Eigenschaft an eine partielle Ansicht übergibt?

Im ASP.NET MVC möchte ich ein häufig verwendeter Satz von Kreditkartenfeldern wiederverwenden, indem ich sie in einer Teilansicht platzieren und diese Teilansicht in einem anderen Formular in einer übergeordneten Ansicht rendern.

Das Problem ist, dass, wenn das CreditCard-Objekt Teil eines Modells ist, das selbst ein komplexes Objekt ist, wenn ich es an die Teilansicht übergebe, fehlen bei der Formularübermittlung die Elternobjektnamenpräfixe, die es dem Standardmodellbinder ermöglichen würden, die Felder dem richtigen Eigenschaft des komplexen Objekts zuzuordnen.

Kreditkartenfelder gerendert in Teilansicht (Falsches Verhalten):

@Html.RenderPartial("~/Views/Pay/CCForm.cshtml", Model.CreditCard ,
 new ViewDataDictionary());

Post-String:

PayOption=1&CreditCardNumberPlainText=0000000000000&StartDateMm=03&StartDateYyyy=2008&ExpiryDateMm=03&ExpiryDateYyyy=2017&SecurityCode=111&IssueNumber=1&X-Requested-With=XMLHttpRequest

Standardformular (Richtiges Verhalten), in dem Kreditkartenfelder in der Hauptansicht mit Feldern wie folgt gerendert werden:

@Html.TextBoxFor(x => x.CreditCard.IssueNumber, new {@maxlength = 3, @size = 3})

Post-String:

PayOption=1&CreditCardInfo.CreditCardNumberPlainText=0000000000000000&CreditCardInfo.StartDateMm=02&CreditCardInfo.StartDateYyyy=2009&CreditCardInfo.ExpiryDateMm=04&CreditCardInfo.ExpiryDateYyyy=2014&CreditCardInfo.SecurityCode=111&CreditCardInfo.IssueNumber=1&X-Requested-With=XMLHttpRequest

4voto

Wahid Bitar Punkte 13023

Warum erstellen Sie nicht eine EditorTemplate für diese CreditCard-Klasse und verwenden sie dann einfach in Ihrer Elternansicht

Zum Beispiel

EditorTemplate: CreditCard.cshtml im EditorTemplates-Ordner im Shared-Ordner fügen Sie in dieser Datei die Bearbeitungsfelder für die Kreditkarte hinzu. Etwas wie dies:

@Html.EditorFor(x => x.IssueNumber)
//........... usw.

dann rufen Sie in Ihrer Ansicht einfach auf:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X